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
|