最終更新: 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();