秀丸V9.20 がパイプのあとで使えなくなっNo.40329
しろおか さん 23/02/23 18:42
 
V9.19に戻すと、問題なく使えます。確認した環境は64ビットのWindows11のコマンド
プロンプトです。秀丸エディターは32ビット版を使用しています。コマンドプロンプ
トで秀丸エディターの起動自体はできますし、パイプのあとでも起動されますが、内
容が何も送られないようです。

[ ]
RE:40329 秀丸V9.20 がパイプのあとで使えNo.40330
秀丸担当 さん 23/02/24 09:38
 
パイプというのは、
dir | hidemaru.exe
といったようにプログラムの標準入力として起動したときのことかと思います。
この機能はずっと以前にヘルプに書かずやろうとして、あまり適切ではなかったので
やめようとしていました。
使い方を書いていなかったと思うのですが、使えなくなったというご指摘があり、と
りあえず復活させていました。
とりあえずと言ってもV4.xxくらいのずっと以前のことです。
適切でないというのは、標準出力が無いのでパイプとしての役割を果たしていなくて、
起動した秀丸エディタを手動で終了させないと起動元をブロックしたままになるとう
ことがあります。
あと遅いです。

V9.19では起動オプション/stdioと、hidemaru.getCurrentProcessInfoで標準入出力
を制御できるようになって、V9.20β3で標準入力のこの機能を廃止しました。
標準出力までも含めた例はマクロヘルプのgetCurrentProcessInfoのところにあります。

標準入力だけを見て、標準出力せずブロックするような従来の使い方の場合、簡単に
は以下のようなマクロでする方法があります。

//pipe.mac
js{
  insert(hidemaru.getCurrentProcessInfo().stdIn.readAll(5*1000));//5秒でタイ
ムアウト
}

これをマクロファイル用のフォルダにpipe.macとして保存します。実行はバッチファ
イルとか作って、例えば以下のようにします。

REM //hm.bat
"C:\Program Files (x86)\Hidemaru\Hidemaru.exe" /stdio:sjis /xpipe.mac

コマンドプロンプトでは、

dir |hm

とすると標準入力を画面に出し、手動で終わらせるまでブロックします。
もし問題なければこちらの方法を使ってもらえると助かります。
互換性の都合でやっぱり従来のhidemaru.exeだけの方法が必要という場合、また復活
させるか検討します。

他の使い方としては、newfile;して結果をそちらに挿入し、起動したほうはclosehid
emaruforced(#h);で終了させると、起動元をブロックしないようにもできます。

何らかの標準出力を延々とし続けるプログラムがあったとして、それをモニタリング
し続けるという場合、hidemaru.getCurrentProcessInfo().stdIn.onReadLine(...)で
非同期的な処理も一応できるようになっています。
モニタリングだとして、従来の裏技の場合はCPUをだいぶん使ってループして、秀丸
エディタ側からは中断もできないです。
onReadLineだと、CPUを使わず、標準入力があったときだけ動いて、秀丸エディタの
操作もできるようになっています。
いざ作るとなるとたぶん複雑なので、もし必要であればサンプルなど作ります。

[ ]
RE:40330 秀丸V9.20 がパイプのあとで使えNo.40331
しろおか さん 23/02/24 10:54
 
>V9.19では起動オプション/stdioと、hidemaru.getCurrentProcessInfoで標準入出力
>を制御できるようになって、V9.20β3で標準入力のこの機能を廃止しました。

そうだったんですね。

>標準入力だけを見て、標準出力せずブロックするような従来の使い方の場合、簡単
>には以下のようなマクロでする方法があります。
>
>//pipe.mac
>js{
>  insert(hidemaru.getCurrentProcessInfo().stdIn.readAll(5*1000));//5秒でタ
>イムアウト
>}

>これをマクロファイル用のフォルダにpipe.macとして保存します。実行はバッチフ
>ァイルとか作って、例えば以下のようにします。

>REM //hm.bat
>"C:\Program Files (x86)\Hidemaru\Hidemaru.exe" /stdio:sjis /xpipe.mac
>
>コマンドプロンプトでは、
>
>dir |hm
>
>とすると標準入力を画面に出し、手動で終わらせるまでブロックします。
>もし問題なければこちらの方法を使ってもらえると助かります。

V9.19ですが、この方法でも出力されることを確認しました。どうもありがとうござ
いました。これで問題解決です。

>互換性の都合でやっぱり従来のhidemaru.exeだけの方法が必要という場合、また復
>活させるか検討します。

いちいち保存して、そのファイルを開く必要がないので、パイプをよく利用していま
した。秀丸に出力できれば、結果を眺めてみたり、そのまま編集して、別の文書に張
り付けたりしていました。しかし、上の方法で十分ですね。

Wordを使うような場合は start winword では起動しかしれてくれませんから、パイ
プと使える秀丸は便利に利用させていただいていました。

>他の使い方としては、newfile;して結果をそちらに挿入し、起動したほうはclosehi
>demaruforced(#h);で終了させると、起動元をブロックしないようにもできます。

この後もいろいろと書いていただき、ありがとうございます。私は、単純に標準入力
からのデータの受け取りにしか使っていないのですが、なかなか奥深い使い方もでき
そうなのですね。

[ ]
RE:40330 秀丸V9.20 がパイプのあとで使えNo.40333
ラフ さん 23/02/27 03:48
 
横から失礼します。

hidemaru.getCurrentProcessInfo().stdIn.onReadLine(...)で非同期的な処理も一応
できるようになっています。
>モニタリングだとして、従来の裏技の場合はCPUをだいぶん使ってループして、秀丸
>エディタ側からは中断もできないです。
>onReadLineだと、CPUを使わず、標準入力があったときだけ動いて、秀丸エディタの
>操作もできるようになっています。
>いざ作るとなるとたぶん複雑なので、もし必要であればサンプルなど作ります。

使ってみたいのでonReadLineのサンプル作っていただけますか?

[ ]
RE:40333 秀丸V9.20 がパイプのあとで使えNo.40338
秀丸担当 さん 23/02/27 12:18
 
標準入出力を使って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と組み合わて、使っている秀丸エディタとは全く別の存在にしてマクロ実
行中の競合が無いようにしています。

[ ]
RE:40338 秀丸V9.20 がパイプのあとで使えNo.40339
ラフ さん 23/03/01 06:11
 
サンプルありがとうございます。
例1を改造して、WSHのスクリプトからWscript.Shellオブジェクト使用で、データの
やり取りできることを確認しました。
秀丸ファイラーとの連携がいろいろ出来そうです。

マクロヘルプのStdioオブジェクトの説明分の各例文ですが、stdInとstdOutが逆にな
っています。

[ ]
RE:40339 秀丸V9.20 がパイプのあとで使えNo.40340
秀丸担当 さん 23/03/01 10:08
 
stdInとstdOutは、呼ぶ側にも呼ばれる側にも両方あって、読み書きで4パターンある
ことになります。
ご指摘を受けて、例えばstdInの入力なのにwriteで書き込むというのは妙に感じてし
まったのですが、どちらでもいいはずです。
マクロヘルプのStdioオブジェクトの例は、呼ぶ側の場合の例でした。
秀丸エディタがcmd.exeを起動すれば、cmd.exeの標準入力(stdIn)に書き込んで(writ
e)、結果を標準出力(stdOut)から読み取り(read)ます。
コマンドプロンプトからhidemaru.exeを起動すれば、自分自身のhidemaru.exeの標準
入力(stdIn)を読み込んで(read)、標準出力(stdOut)に書き込み(write)ます。

秀丸エディタどうしでもよくて、
自分hidemaru.exeが相手hidemaru.exeのstdInにwrite
相手hidemaru.exeがstdInからread
相手hidemaru.exeがstdOutにwrite
自分hidemaru.exeが相手hidemaru.exeのstdOutからread
ということもありになると思います。

[ ]
RE:40340 秀丸V9.20 がパイプのあとで使えNo.40341
ラフ さん 23/03/01 13:02
 
そうなんですが、ヘルプの例としては明確に記さないと不備になりますよね
「以下は、秀丸エディタが呼び出し側となる場合の例です。呼ばれる側になる場合は
stdInとstdOutが逆になります。」
のような一文が必要になるかと思います。

[ ]
RE:40341 秀丸V9.20 がパイプのあとで使えNo.40342
秀丸担当 さん 23/03/01 13:42
 
ご指摘ありがとうございます。
確かに片方だけの例ではわかりづらいと思います。
そういった文を追記しておきます。

[ ]