/ 最近 .rdf 追記 編集 設定 本棚

脳log[20120227] なんで ActiveScriptRuby(旧称?)を直接使わないの?



2012年02月27日 (月) 変な茶々は入れるまい。リンクはなし。STDINと(省略された)$stdoutの組み合わせはちぐはぐだとか、Scripting.FileSystemObjectは最初に一回だけ作成して使い回すんだとか、WshScriptExecっていう入出力を扱うオブジェクトが Windows(WSH5.6から)に用意されていて JScriptで利用できるんだとか、コメントアウトされた echoバージョンのコマンドでもウチでは動いた(※だけどところどころ lineの内容によって指定されたファイルが見つからないというメッセージが出た)とか、言いたい。

最終更新: 2012-02-29T12:47+0900

[SakuraEditor] なんで ActiveScriptRuby(旧称?)を直接使わないの?

と思わないでもないけど、Rubyマクロにはエディタ側に色々と問題があるのがわかってるので、大枠に沿ったまま書き直してみた。WshScriptExecを使ってみたかっただけ。WshScriptExecを得る方法は WScript.Shell.Execだけなんだけど、これを実行すると必ずコンソールが表示されるのがうまくない。こっそり実行して処理結果だけ欲しいのに。

 script.rb

# coding: windows-31j
$/ = "\r\n"
$stdout.sync = true # putsした内容をすぐ flushして .jsが受け取れるように。
puts("[size = % 4d]" % $_.chomp.size) while gets

 call_ruby.js

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();