最終更新: 2012-02-29T12:47+0900
と思わないでもないけど、Rubyマクロにはエディタ側に色々と問題があるのがわかってるので、大枠に沿ったまま書き直してみた。WshScriptExecを使ってみたかっただけ。WshScriptExecを得る方法は WScript.Shell.Execだけなんだけど、これを実行すると必ずコンソールが表示されるのがうまくない。こっそり実行して処理結果だけ欲しいのに。
# coding: windows-31j $/ = "\r\n" $stdout.sync = true # putsした内容をすぐ flushして .jsが受け取れるように。 puts("[size = % 4d]" % $_.chomp.size) while gets
var RubyBin = "ruby"; var RubyScr = "script.rb"; var RubyExec = new ActiveXObject("WScript.Shell").Exec("\""+ RubyBin +"\" \""+ RubyScr +"\""); RubyExec.StdErr.Close(); /* (折り返し行でない)改行単位でのカーソル移動が「GoLineTop」しかなさそうなので、これを基にしてカーソル移動を行う。 ExpandParameterで $yの変化を監視する手もあるにはある。 */ // 開始地点(最終行)へ移動。 Editor.GoFileEnd(); Editor.GoLineTop(9); if (! Editor.GetLineStr(0)) { Editor.Up(); // skip [EOF] only line. } // 下から上へ一行ずつ処理する。 for (var linenum = Editor.GetLineCount(0); 1 <= linenum; --linenum) { if (RubyExec.Status != 0) { // if not running break; // 継続は無意味。 } RubyExec.StdIn.WriteLine(Editor.GetLineStr(0).replace(/(?:\r\n?|\n)$/, "")); // カーソル行の文字列をRubyに送る Editor.InsText(RubyExec.StdOut.ReadLine()); //カーソルを上の行の先頭へ移動 Editor.GoLineTop(9); Editor.Up(); } RubyExec.StdIn.Close(); RubyExec.StdOut.Close(); RubyExec.Terminate();