著作一覧 |
結局、子プロセスの標準出力も読むことにしようとすると、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
ジェズイットを見習え |