【ご教示をお願い】「seterrormode 1,0;でNo.38870
dszhm さん 21/04/13 11:31
 
環境は
OS
Windows 10 Pro 64bit 20H2
Build 19042.685
秀丸エディタ
8.97 64bit Float
です。

run文でスクリプトエンジンを起動し、秀丸の内容に対してスクリプトによる加工を
行っているのですが、
---------------------------
エラー
---------------------------
マクロ内から秀丸エディタを起動したはずですが、10秒待っても応答がありません。

(seterrormode 1,0;でこのエラーは抑制できます)
---------------------------
再試行(R)   キャンセル  
---------------------------
というダイアログが出るので、抑制しようとしてマクロ中の run 文の直前で「seter
rormode 1,0;」するようにしてみたのですが、相変わらず上記のダイアログが表示さ
れます。
他に何らかの設定等が必要なのでしょうか?
或いは根本的な勘違いをしているのでしょうか?

ちなみに、スクリプト実行環境はライブラリのものではなく、自前です。

[ ]
RE:38870 【ご教示をお願い】「seterrormoNo.38871
秀丸担当 さん 21/04/13 13:14
 

試してみようとしたのですが、もともとこのエラーが出ること自体の再現が難しく、
デバッグ用に意図的にそういう状態を作り出すとエラーが出る状態は作れるのですが、
どういう状態で出るのか詳しいことがわかると確認できるかもしれません。

意図的に新しいhidemaru.exeがすぐ起動しない状態を作り出して、エラーが出る状態
はできたのですが、その場合、seterrormode 1,0;をしておけばエラーが出なくなる
ことが確認できました。

1つ気になったこととしては、run文を使っていることがあります。
本来newfileやopenfileなど、新しい秀丸エディタが起動する場合は、そのひでまる
エディタにマクロの実行が移ることになっています。
run文で「>con」を付けたときは例外で、新しい秀丸エディタが起動するけど、マク
ロの実行は移らないようになっています。
一時期移るように修正しようとしたことがあったのですが、それだと互換性で困ると
いう話があって、この動作を維持しています。
そのあたりが関係している可能性はあると思いますが、再現はできていないです。
ちゃんとしたマクロの実行が移る動作にするためには、runex文を使うといいです。

[ ]
RE:38871 【ご教示をお願い】「seterrormoNo.38872
dszhm さん 21/04/13 15:48
 
>1つ気になったこととしては、run文を使っていることがあります。
>本来newfileやopenfileなど、新しい秀丸エディタが起動する場合は、そのひでまる
>エディタにマクロの実行が移ることになっています。
>run文で「>con」を付けたときは例外で、新しい秀丸エディタが起動するけど、マク
>ロの実行は移らないようになっています。
>一時期移るように修正しようとしたことがあったのですが、それだと互換性で困る
>という話があって、この動作を維持しています。
>そのあたりが関係している可能性はあると思いますが、再現はできていないです。
>ちゃんとしたマクロの実行が移る動作にするためには、runex文を使うといいです。

とのご教示に従い、runex 文にしてみようと思いますが、

runex スクリプト実行(エンジンのexeパスとスクリプトファイルパスと必要なオプ
ション),
 1,     //0=Async 1=Sync
 2      //flag for stdin
        //when !selecting && !updated && filename!=""
  or
  4     //when !selecting && updated
  or
  5,    //when selecting
 filename //when !selecting && !updated && filename!=""
  or
  "",   //another
 1,     //flag for stdout, 1=auto
 "",    //name for stdout, "" for dummy
 1,     //flag for stderr, 1=same as stdout or auto
 "",    //name for stderr, "" for dummy
 0,     //flag for work folder, 0=not speicifed
 "",    //name for work folder, "" for dummy
 0,     //flag for display, 0=auto
 0,     //flag for non-draw, 0=draw
 2      //when encode is utf-16
  or
  6     //when encode is utf-8
  or
  0,    //another
 0)     //flag for extension, 0 for dummy
のような感じの呼び出し方で良いのでしょうか?

[ ]
RE:38872 【ご教示をお願い】「seterrormoNo.38873
秀丸担当 さん 21/04/13 16:33
 

元のrun文がどうだったかわからないのでなんとも言えないですが、マクロが切り替
わるかどうかを確実にするには、同期(sync)は1でいいです。
標準出力(stdout)は、1(auto)だと挿入されるか新規に起動するかは状況によるの
で、決まった動きにする場合は、4〜6を明示的に指定するといいと思います。

[ ]
RE:38873 【ご教示をお願い】「seterrormoNo.38874
dszhm さん 21/04/13 16:43
 
>元のrun文


if ( selecting || updated || filename == "" )
{
  run "Engine.exe script.xx <con >con";
}
else
{
  run "Engine.exe script.xx \"" + filename2 + "\" >con";  
}
のようになっています。


[ ]
RE:38874 【ご教示をお願い】「seterrormoNo.38875
秀丸担当 さん 21/04/13 17:20
 

元のrun文の情報ありがとうございます。
runex文に渡すコマンドラインは、「<con」や「>con」を無くす必要があります。
標準入力は、状況に応じて期待するものを指定するといいですが、元のrun文がファ
イル名をパラメータにされているようで、それに合わせるのであれば、コマンドライ
ンのほうにファイル名を書いて、標準入力の2とファイル名は書かなくていいです。
標準出力は、4や6の期待するものを指定するといいです。

あと、もしif文で、
if(!selecting && !updated && filename!=""){...}
というように、先に!を書いて、それを&&や||する場合、秀丸エディタのマクロの昔
ながらの演算子の優先順位の関係で、期待する結果と違う場合があります。(標準で
は警告メッセージが出ます)
なるべく、
if(selecting!=false && updated!=false && filename!=""){...}
といったように書くといいです。

例:
if ( selecting || updated || filename == "" )
{
  $cmdline = "Engine.exe script.xx";
  f( selecting ) {
    #stdin = 5;//selection
    #stdout = 4;//new window
  } else {
    #stdin = 4;//current content
    #stdout = 4;//new window
    //あるいは #stdout = 6;//replace
  }
}
else
{
  $cmdline = "Engine.exe script.xx \"" + filename2 + "\"";
  #stdin = 0;
  #stdout = 4;//new window
}
runex $cmdline,
 1, //sync
 #stdin,
 "",
 #stdout,
 "",
 ...
 ;

[ ]