[ 新規に投稿する ]

秀丸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;して結果をそちらに挿入し、起動したほうはclosehidemaruforced(#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;して結果をそちらに挿入し、起動したほうはclosehidemaruforced(#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)に書き込んで(write)、結果を標準出力(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 [ コメントを投稿する ]
  ご指摘ありがとうございます。
確かに片方だけの例ではわかりづらいと思います。
そういった文を追記しておきます。
[ ]

[ 新規に投稿する ]