| 著作一覧 |
結局、子プロセスの標準出力も読むことにしようとすると、readline内で止まる(拡張ライブラリ内のIOだからだな、多分)ので標準出力を読み切れないし、かといって昨日の状態のままだと、標準出力をまじめに使っているプログラム(たとえばirb)を起動するとプロンプトが表示されなくなるし(ここは原理がまだわかってない)、ftp.exeのようにキーボードを直接読んでいるらしいプログラムを呼び出すと殺されるし(なんとなく理由はわかる)、cmd.exeの内部コマンドを実行するには便利だが、対話型プログラムの実行には向かないことがわかり、がっかりだ。
最終状態
#!/usr/local/bin/ruby -Ks
# coding: cp932
require 'readline'
def mode(m)
if m == 'vi'
Readline.vi_editing_mode
elsif m == 'emacs'
Readline.emacs_editing_mode
end
end
IO.popen("#{ENV['ComSpec']} /A /Q", "w") do |cmd|
loop do
buf = Readline.readline('', true)
if buf.nil?
cmd.puts "\x1a"
puts
else
Readline::HISTORY.pop if buf =~ /\A\s*\Z/
if buf.size == 0
cmd.puts "\x1a"
elsif buf == 'exit'
exit 0
elsif buf[0] == ?:
mode buf[1..-1].lstrip
cmd.puts
else
p "-#{buf.length}-#{buf}--" if $DEBUG
cmd.puts buf
end
end
end
end
ジェズイットを見習え |