[ 新規に投稿する ]

マクロの自動起動No.40979
(-L-) さん 23/12/18 23:18 [ コメントを投稿する ]
ブラウザのウォッチや個別ブラウザのウォッチ、上書き保存で更新などをトリガーにマクロの自動起動の設定ができるようになりますでしょうか。
(正直、個別ブラウザのウォッチと上書き保存の違いがよくわかってはいませんが。。)
保存直前と直後が既にあるので、それを使う感じでしょうか。
[ ]
RE:40979 マクロの自動起動No.40980
秀丸担当 さん 23/12/19 09:04 [ コメントを投稿する ]
  ブラウザ枠/個別ブラウザ枠のウォッチは、ファイルが更新されているかどうか見て受動的に更新します。
他のアプリがファイル更新しても更新します。

個別ブラウザ枠の上書き保存で更新は、枠に対応するそれぞれの秀丸エディタ本体で、上書き保存を実行したときに、能動的に更新します。
個別ブラウザ枠で本体と同じファイルかどうかは関係なく、タイミングだけです。

ウォッチのほうで自動起動する設定は無いです。
現状でやるとしたら、ローカルファイルとしてJavaScriptを後から埋め込んだりするとできるとできる気がしますが、結構大変なことになると思います。

上書き保存で更新は、単なる上書き保存なので、自動起動マクロの保存直前と直後で指定するマクロをそのまま使うことができます。
条件はなんでも自由にできますが、あまり深いことを考えずに自分用のマクロを作るとしたら、以下のような感じで特定のファイルでのみ動作するといいかもしれません。

if( event == 3 ) {//保存直前と直後
  #a = geteventparam( 0 );
  if( #a == 0 ) {
    //message "保存直前";
  } else if( #a == 1 ) {
    //message "保存直後";
    if(filename==tolower(@"C:\folder\test.html")){
      message "目的のファイルを保存した";
    }
  }
}
[ ]
RE:40980 マクロの自動起動No.40982
(-L-) さん 23/12/19 23:40 [ コメントを投稿する ]
>上書き保存で更新は、単なる上書き保存なので、自動起動マクロの保存直前と直後で指定するマクロをそのまま使うことができます。

この件の延長で、マクロのヘルプにある

”秀丸エディタのマクロは実行中にESCキーを入力したり、マウスでクリックしたりすると「中断しますか?」と聞いてくる仕様になっています。disablebreak文を実行すると、そのマクロでは中断を一切受け付けなくなります。”

の件ですが、disablebreakで「中断しますか?」を出さなくすることはできました。
もちろん、マクロは中断しない(終了まで実行させたい)のですが、その間、エディタでソースを編集することができません。

マルチスレッド的にといいますか、マクロは最後まで実行しきってもらいつつ、編集作業を並行して実施できるようにはならないでしょうか。

編集画面を操作するようなマクロであれば、編集できないというのも納得なのですが、マクロは一生懸命、外部プログラム実行&個別ブラウザ更新の処理に向かって進んでいる。=すでにセーブしたファイルが引数で外部プログラムに渡っている。という状態なので、編集画面がロックしてしまい次の編集作業に進めないことがストレスなのです。
[ ]
RE:40982 マクロの自動起動No.40983
こみやんま さん 23/12/20 03:34 [ コメントを投稿する ]
 
>編集画面を操作するようなマクロであれば、編集できないというのも納得なのですが、マクロは一生懸命、外部プログラム実行&個別ブラウザ更新の処理に向かって進んでいる。=すでにセーブしたファイルが引数で外部プログラムに渡っている。という状態なので、編集画面がロックしてしまい次の編集作業に進めないことがストレスなのです。

そういったことをも実現するために、同期ではなく非同期で動作するJavaScriptモードを作成したのでは...
[ ]
RE:40983 マクロの自動起動No.40984
(-L-) さん 23/12/20 09:24 [ コメントを投稿する ]
>そういったことをも実現するために、同期ではなく非同期で動作するJavaScriptモードを作成したのでは...

コメントありがとうございます。
正直、秀丸マクロ系はウォッチしていないので、よくわかっていません。
そういった情報というのは、どこを見ればいいのかさえ、よくわかっていません。
(ある程度、自分のやりたいことができたら、細かいことはいいかな程度のスタンス)

私にとって、
秀丸マクロのヘルプも、知りたい情報にアクセスするのが非常に困難です。

たとえば、「保存直前と直後」のステータスを判断するのを秀丸のヘルプでみると、「直前と直後を知るにはマクロヘルプを参照してください。」とあるのですが、マクロヘルプで、「直前」とか「直後」のキーワードで検索してもヒットしないなど。
なにがどこに書いてあるのやら、マクロのコマンド名称ひとつ探すのでさえ迷子になるのです。

javascriptモード(マクロの書き方?マクロの動作方法?)というので解決する話だ。とおっしゃっているのは理解できるのですが、それらを自分で取り組んでみよう。と思っても情報にたどりつけないのです。

なにか、ここを見ろ!的な情報など、いただけると幸いです。
[ ]
RE:40984 マクロの自動起動No.40985
秀丸担当 さん 23/12/20 09:59 [ コメントを投稿する ]
  マクロヘルプの検索は、キーワード(N)タブで見ると決められたものしか見えないので、文の名前を探すのには向いていますが、自由な文字列には向いていないです。
検索(S)タブのほうで見るといいです。

何らかの外部のプログラムを実行して非同期で待つには、 hidemaru.runProcessがあります。
標準入出力のコンソールアプリを扱うときに使えます。
例:

js{
  debuginfo(2);
  var exe = hidemaru.runProcess("cmd.exe /U /C dir", directory2(), "stdio", "utf16" );
  var stdOut = exe.stdOut;
  stdOut.onReadAll( readAllAsync ); //固まりません

  function readAllAsync(out) {
    //ここはマクロ実行中ではない
    console.log(out);
    //再び普通のマクロにするとしたら、hidemaru.postExecMacroFile("xxx.mac");とか
  }
}
endmacro;

ごちゃごちゃしていますが、ある程度JavaScriptの書き方をしないと難しいかもしれません。
上記の例は、コマンドプロンプトでdirをしているのを非同期で待っているものになります。
[ ]
RE:40985 マクロの自動起動No.40986
(-L-) さん 23/12/20 10:46 [ コメントを投稿する ]
>ごちゃごちゃしていますが、ある程度JavaScriptの書き方をしないと難しいかもしれません。
>上記の例は、コマンドプロンプトでdirをしているのを非同期で待っているものになります。

秀丸マクロのjs{}と、従来、秀丸マクロとの関係もよくわからないところです。
js{}のなかに全部書かないとだめって感じなのか。とか。
basename2みたいな内部変数みたいなのしかサンプルがないので
例えば、変数をつかいたいとき

 $a = "hogehoge";

これを、js{}のなかで使おうとすると宣言うんたらと怒られるので、ここで迷子になります。
秀丸ヘルプの各関数のサンプルに、変数つかうときのサンプルでもあれば理解できるかなと思うのですが。
など、もう少しサンプルのパターンが充実していると、それらを参考に進められるのだけど、という感じなのです。

今は、javascriptとか秀丸マクロとかある程度知っている人以外はヘルプ読んでも分からないヘルプという印象があります。
[ ]
RE:40986 マクロの自動起動No.40987
(-L-) さん 23/12/20 11:52 [ コメントを投稿する ]
おしいところまではできた気がするのですが。

js{}のrunProcessで、hogehoge.exeを起動した(できた)として、
このhogehoge.exeコマンドの処理が終了(hogehoge.exeは自動で終了する)したのを確認してから、refreshbrowserpaneを行いたい。
(hogehoge.exeが吐いた出力の最新結果を表示させたいケース)

runProcessのstatusプロパティでwhileすればいいのかな?
とかの想像まではするのですが、このあたりの書き方とかがヘルプに無いので迷子になります。
[ ]
RE:40986 マクロの自動起動No.40988
秀丸担当 さん 23/12/20 11:59 [ コメントを投稿する ]
  サンプルは確かに少ないかもしれないです。
今後も増やしていこうと思います。

ちなみにJavaScriptで書くということそのものについては、多くのケースで#や$を無くして全部に()を付けるように文法を合わせることで、だいたいそのままの形で移植できるようになっています。
マクロヘルプの参考:
目次− JavaScript対応−グローバルの記述 
目次− JavaScript対応− HidemaruGlobalオブジェクト−メソッド

変数は従来マクロとjs{}無いで全く別になっていて、getVarとsetVarでやりとりできます。
必要な部分だけjsにして、あとはgetVarとsetVarでしてもいいです。

ただ非同期の場合は、そのままではできず、いろいろ制約があって難しい部類になります。
上記のような簡単に移植するような話ではなくなってきます。
やっぱり普通はキー操作の記録と再生のマクロだったり、順次実行で深いこと気にせずに書けるのが一番便利だと思います。

JavaScriptのことを書いておいてなんですが、非同期を作りこむのではなく、今までのようにサクっと作る場合、バッチファイルを作って/m3xオプションを使うのがいいかもしれません。
/m3xは、既存の同ファイル名が開いていれば、そこでマクロを実行するので、処理開始だけ投げて、処理後のマクロを実行できます。

例:test1.mac
//処理前
run @"cmd.exe /C c:\folder\test2.bat "+filename2;

例:test2.bat
'処理
hogehoge.exe %1
"c:\program files\hidemaru\hidemaru.exe" /m3x /x "test3.mac" "%1"

例:test3.mac
message "処理後";
[ ]
RE:40987 マクロの自動起動No.40989
秀丸担当 さん 23/12/20 12:10 [ コメントを投稿する ]
  hogehoge.exeが標準入出力のコンソールアプリなら、先の例の通りです。
例はutf16だったので、最近のアプリだとutf8じゃないといけなかったりするかもしれません。
hogehoge.exeがメモ帳のようなGUIアプリだとしたら、onReadAllでは待てないです。
whileでチェックをループすると固まってしまうので、setIntervalで定期的にチェックするという方法もあります。

更新を見てrefreshbrowserpaneをするだけで、他のことは必要でない場合、既に試されているかもしれないんですが、ウォッチをONにするだけでいいです。(たぶんそれでは何らかの不足があるのでマクロということだと思います)
[ ]
RE:40989 マクロの自動起動No.40990
(-L-) さん 23/12/20 13:14 [ コメントを投稿する ]
>whileでチェックをループすると固まってしまうので、setIntervalで定期的にチェックするという方法もあります。

今回の件でいうと、
こういう、setIntervalという単語自体に自力で辿り着けない感じなのです。
ヘルプにて、自分が調べた項目のサンプルなどからこういった関連しそうなものにズルズルと触れていけると、ここでサポートいただくお手間をとらせることも少なくなるのに。という感じです。

取り急ぎ御礼まで。
[ ]
RE:40985 マクロの自動起動No.41027
(-L-) さん 24/01/22 08:27 [ コメントを投稿する ]
>js{
>  debuginfo(2);
>  var exe = hidemaru.runProcess("cmd.exe /U /C dir", directory2(), "stdio", "utf16" );
>  var stdOut = exe.stdOut;
>  stdOut.onReadAll( readAllAsync ); //固まりません
>
>  function readAllAsync(out) {
>    //ここはマクロ実行中ではない
>    console.log(out);
>    //再び普通のマクロにするとしたら、hidemaru.postExecMacroFile("xxx.mac");とか
>  }
>}
>endmacro;


hidemaru.runProcessで実行したCUIプログラムが出力するSTDOUTを拾って
アウトプット枠に表示させたいのですが、どう追記すれば良いかが
ヘルプをみても分かりませんでした。

debuginfo(2);で秀丸マクロがエラーを吐いたときはアウトプット枠に出力される。という動きは
理解できたのですが、stdOut.onReadAll( readAllAsync );を呼んだときに、readAllAsync に
何も引数がないので、readAllAsync の中のconsole.logが何をしているのかとか、outが何を指して
いるのかとかもよく分かりませんでした。

このあたりはヘルプのどこを参照すると理解できるものなのかなど、ご教示いただけないでしょうか。

[ ]
RE:41027 マクロの自動起動No.41028
秀丸担当 さん 24/01/22 09:44 [ コメントを投稿する ]
  まず手っ取り早く動作確認するには、runProcessの最後のパラメータの"utf16"の部分を変えてみるといいかもしれません。
"sjis"
"utf8"
"utf16"
のいずれかを指定します。

ヘルプの見かたとしては、手軽にはonReadAllで検索すると、Stdioオブジェクトのものがあるので、そのページ中にonReadAll(func)があります。

手軽ではなく順を追ってみるとしたら、最初はhidemaru.runProcessのヘルプで、返り値はProcessInfoオブジェクトとわかります。
その次のstdOutは、ProcessInfoのStdioオブジェクトとわかります。
その次のonReadAllは、Stdioのメソッドとわかります。

console.logは、ブラウザの書き方に寄せたもので、これはちょっと特殊です。
実際はただの従来のdebuginfo文に置き換えられるものです。ややこしくてすみません。
setTimeoutとかも、ブラウザの書き方に寄せたりしています。

----

より高度には、読み飛ばしてもらっていいですが、node.jsとLSPマクロを入れて、拡張子.tsで書いて、.jsにコンパイルするようにして、.macからはexecjsで呼ぶようにしたりできます。
タイプを定義する.tsを配置して、これを使うと、秀丸エディタ上でも文法間違いが赤線で表示されたり説明が出たりします。
LSPマクロには簡単なものがありますが、こみやんまさんがちゃんとした定義ファイルを作ったりしてくれていました。
ただ導入までが非常に面倒です。

javascriptを使ったマクロは従来のマクロの感覚とはだいぶん違って、いろいろできたりする反面、そこそこの規模だと理解が困難なものになってきています。
githubに簡単なjsのサンプルマクロだったり、中規模のjsマクロとかオープンソース的に載せれたらいいと思っています。(漠然と)
[ ]
RE:41028 マクロの自動起動No.41029
(-L-) さん 24/01/22 10:17 [ コメントを投稿する ]
ありがとうございました。解決しました。
(今回の件は結果的にStdOutだと信じきっていたが、いただいた回答をもとに試しているうちに、実際はStdErrで出力されていたというオチに気が付いたというものでした。お騒がせしました。。)


>console.logは、ブラウザの書き方に寄せたもので、これはちょっと特殊です。
>実際はただの従来のdebuginfo文に置き換えられるものです。ややこしくてすみません。

console.log自体についてがヘルプで探せなかったです。
console.logがいくつかのところに記載があるのでdebuginfoのようなものだろうと推測はできていました。

このように推測でヘルプを読まないとという感じなので、例えばoutとあって、引数が無いようなものだと、もしかしてoutは予約語?とか、いろいろ推測しはじめてしまって、いらぬ迷子になる感じでした。


[ ]
RE:41029 マクロの自動起動No.41031
秀丸担当 さん 24/01/22 12:42 [ コメントを投稿する ]
  StdErrの違いだったのですね。
できたということでよかったです。

ちなみに標準出力が無い場合の待機が面倒ということがありましたが、V9.30βでは、ProcessInfoオブジェクトにonCloseを追加しています。
console.logやonCloseのヘルプもまた修正していきます。
[ ]
RE:41031 マクロの自動起動No.41032
(-L-) さん 24/01/22 13:01 [ コメントを投稿する ]
>console.logやonCloseのヘルプもまた修正していきます。

ヘルプ修正ということなので、ついでにご連絡。

サンプルに
//ここはマクロ実行中ではない

とあるのですが、
//ここはマクロ実行中ではない
も、js{}のマクロ内じゃんとなって、マクロ実行中ではない?となります。
おそらくrunProcess実行中ではない(待たないよー)的な意味なのだろうとは推測していますが、違うのかしら。とかでも迷子です。
[ ]

[ 新規に投稿する ]