|
標準入出力を使ってonReadLineで非同期的に扱う場合の例です。
onReadLineの関数が直接呼ばれている時点では、従来の秀丸マクロの文や変数は扱え
ず、postExecMacroMemoryで呼びなおす必要があるのがちょっと面倒になります。
秀丸エディタが呼ばれる側の場合と、秀丸エディタが呼ぶ側の場合があります。
//例1 C:\Folder\test1.mac
//秀丸エディタが起動される場合で、ログのようなもの
//コマンドプロンプト:
// dir |"C:\Program Files\Hidemaru\Hidemaru.exe" /@private /stdio:sjis /x
C:\Folder\test1.mac
js{
//起動オプション /stdioが必要
var g = "";
var me = hidemaru.getCurrentProcessInfo();
var stdin = me.stdIn;
stdin.onReadLine(function(s){
g += s; //ログとして全部拾う場合は漏れないようにする
hidemaru.postExecMacroMemory("js{insertDelay();}");
});
function insertDelay(){
insert(g);
g = "";
}
}
endmacro;
//例2 C:\Folder\Test2.mac
//秀丸エディタからプログラムを起動する場合で、状態表示のようなもの
//コマンドプロンプト:
// cd C:\Program Files\Hidemaru
// hidemaru.exe /@private /stdio:sjis /x C:\Folder\test2.mac
js{
var exePath = @"c:\windows\system32\cmd.exe /c dir";
var exe = hidemaru.runProcess(exePath,"","stdio","sjis");
var g = "";
var stdout = exe.stdOut;
stdout.onReadLine(function(s){
g = s; //ログじゃない場合は1つの値を上書き
hidemaru.postExecMacroMemory("js{displayDelay();}");
});
function displayDelay(){
disabledraw2();
selectall();
insertfix(g);
enabledraw(0);
redraw();
g="";
}
}
endmacro;
どちらの例もサンプルとしてdirにしていますが、dirだとあまり意味がなくて、例え
ば時刻を延々と出力するプログラムだったり、そういうものがあるときに使えると思
います。
/@privateと組み合わて、使っている秀丸エディタとは全く別の存在にしてマクロ実
行中の競合が無いようにしています。
|
|