マクロの自動起動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 );を呼んだときに、readAll
Async に
何も引数がないので、readAllAsync の中のconsole.logが何をしているのかとか、ou
tが何を指して
いるのかとかもよく分かりませんでした。

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


[ ]
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実行中ではない(待たないよー)的な意味なのだろうとは推測し
ていますが、違うのかしら。とかでも迷子です。

[ ]