hakeの日記

Windows環境でプログラミングの勉強をしています。

サクラエディタの外部マクロとしてrubyを使う

検索してみるとエディタからJScriptのマクロを呼び出して、その中でrubyスクリプトを呼べば良いみたい。
試してみるとrubyスクリプトの標準出力は、そのままエディタ上のカーソル位置に挿入される様です。JScriptマクロからrubyスクリプトへテキストを渡すには、一旦一時ファイルに出力してファイルを介して行う方法と、そのままrubyスクリプトの標準入力へパイプで渡す方法を試して見ましたが、後者の方がファイルの生成が無い分処理が速い様です。ただし渡すテキスト内に改行があると後者の方法は使えません。

勉強で、行頭にその行の文字数を挿入するマクロを作って見ました。

foobar
あいうえお

このテキストが

[size = 6]foobar
[size = 5]あいうえお

の様になります。JScriptマクロでは先頭行から順に改行コードを削除した文字列をRubyスクリプトに渡し、Rubyスクリプト側ではその文字数を標準出力に出力しているだけです。
当初Rubyスクリプトへ文字列を渡すのにechoコマンドを使用してみたのですが強制的に改行が入ってしまいパイプが繋がらないので、対処方法としてこちらの記事を参考にさせていただきました。

  • JScriptマクロ call_ruby.js (初めて書いたので文法に自信がありません)
var line;
var fso;
var fpout;

var rubybin = "d:\\ruby193\\bin\\ruby.exe";
var rubyscr = "d:\\ruby\\script.rb";
//var tmpfile = "d:\\ruby\\tmp.txt";
var command;



Editor.GoFileTop(0,0,0);              // カーソルをファイル先頭へ移動
var linecnt = Editor.GetLineCount(0); // 全行数取得
var linenum = 1;                      // 現在のカーソル行番号


// line = Editor.GetLineStrをwhileの条件にすると
// 行末にEOFがあった場合に誤動作する
while(linenum <= linecnt ){ 

  line = Editor.GetLineStr(0);      // lineにカーソル行の文字列を代入
  line = line.replace(/\r\n/g, ""); // 改行コード削除

//  lineの内容をtmpfileへ出力する場合
//  fso = new ActiveXObject("Scripting.FileSystemObject");
//  fpout = fso.CreateTextFile(tmpfile);
//  fpout.WriteLine(line);
//  fpout.close();


// lineの内容をrubyスクリプトへパイプさせる
//    「"line"」としないと行末が「<」の場合に誤動作する
  command = "SET /P X=\"" + line + "\"<NUL |" + rubybin + " " +  rubyscr;


//  echoコマンドだと改行が入ってしまいパイプが上手くいかない
//  command = "echo " + line + " | " + rubybin + " " +  rubyscr;


  Editor.ExecCommand(command, 3); //command実行
  Editor.GoLineTop(8);            //カーソルを行頭へ移動
  Editor.Down();                  //カーソルを1行下へ移動
  linenum = linenum + 1;
}
# coding: windows-31j
str = STDIN.gets
str = "" if str.nil?
print("[size = #{str.size}]")