1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
#!/usr/bin/env ruby
#
# irbtkw.rb : IRB console with Ruby/Tk
#
# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)
#
release = '2008/03/08'
require 'tk'
begin
require 'tktextio'
rescue LoadError
require File.join(File.dirname(File.expand_path(__FILE__)), 'tktextio.rb')
end
require 'irb'
if TkCore::WITH_ENCODING
else
# $KCODE setup
case Tk.encoding
when 'shiftjis', 'cp932'
$KCODE='SJIS'
when 'euc-jp'
$KCODE='EUC'
when 'utf-8', 'unicode'
$KCODE='UTF8'
else
# unknown
end
end
# console setup
top = TkToplevel.new(:title=>'IRB console')
top.protocol(:WM_DELETE_WINDOW){ Tk.exit }
case (Tk.windowingsystem)
when 'win32'
fnt = ['MS Gothic', '-12']
else
fnt = ['courier', '-12']
end
console = TkTextIO.new(top, :mode=>:console,
:width=>80).pack(:side=>:left,
:expand=>true, :fill=>:both)
console.yscrollbar(TkScrollbar.new(top, :width=>10).pack(:before=>console,
:side=>:right,
:expand=>false,
:fill=>:y))
# save original I/O
out = $stdout
err = $stderr
irb_thread = nil
ev_loop = Thread.new{
begin
Tk.mainloop
ensure
$stdout = out
$stderr = err
irb_thread.kill if irb_thread
end
}
# window position control
root = Tk.root
r_x = root.winfo_rootx
r_y = root.winfo_rooty
r_w = root.winfo_width
t_x = top.winfo_rootx
t_y = top.winfo_rooty
t_w = top.winfo_width
delta = 10
ratio = 0.8
s_w = (ratio * root.winfo_screenwidth).to_i
if r_x < t_x
r_x, t_x = t_x, r_x
end
if t_x + t_w + r_w + delta < s_w
r_x = t_x + t_w + delta
elsif t_w + r_w + delta < s_w
r_x = s_w - r_w
t_x = r_x - t_w
else
r_x = s_w - r_w
t_x = 0
end
root.geometry("+#{r_x}+#{r_y}")
top.geometry("+#{t_x}+#{t_y}")
root.raise
console.focus
# I/O setup
$stdin = console
$stdout = console
$stderr = console
# dummy for rubyw.exe on Windows
def STDIN.tty?
true
end
# IRB setup
IRB.init_config(nil)
IRB.conf[:USE_READLINE] = false
IRB.init_error
irb = IRB::Irb.new
IRB.conf[:MAIN_CONTEXT] = irb.context
class IRB::StdioInputMethod
def gets
prompt = "\n" << @prompt
$stdin.instance_eval{
flush
@prompt = prompt
_set_console_line
@prompt = nil
_see_pos
}
@line[@line_no += 1] = $stdin.gets
end
end
# IRB start
$stdout.print("*** IRB console on Ruby/Tk (#{release}) ")
irb_thread = Thread.new{
catch(:IRB_EXIT){
loop {
begin
irb.eval_input
rescue Exception
end
}
}
}
console.bind('Control-c'){
console.insert('end', "^C\n")
irb_thread.raise RubyLex::TerminateLineInput
}
irb_thread.join
# exit
ev_loop.kill
Tk.exit
|