[ 新規に投稿する ]

非同期にしたほうが良さげ関数シリーズNo.10600
こみやんま さん 25/02/27 14:24 [ コメントを投稿する ]
  ■screentopy()

実際、秀丸の文字列全体中で、どこの文字列をユーザーは実際に映しているのか?
という意味で、

screentopy();

は「少々ネイティブプログラム書けようが代替物を制作しにくい」
ので非同期にした方が良いかと。
(ytolinenoはすでに非同期なので)

(秀丸で画面で映ってる一番上の行)
let screenTopLineNo = ytolineno(0, screentopy());


■currentmacrodirectory();

本当は変数キャッシュに控えておきたくはないのだけれど、
これを非同期でも使える関数にするのは相当にたいへんか?
という気もしないでもないですねぇ。

実際に非同期でも欲しいのは selfmacrofiledirectory() とでも称するものでしょうか。

単純に個人が単純目的で実装すると、
jsmode "WebView2\\" + currentmacrofilename;
js {
    (function(){
        var dir = currentmacrodirectory();
        selfmacrofiledirectory = function() {
            return dir;
        }
    })();


    debuginfo(2);
    hidemaru.setTimeout(()=>{ console.log(selfmacrofiledirectory()); }, 100);
}

ですが、これを「汎用で実装」するのは、かなり難易度が高そう...

・複数のマクロファイル実行でも同じjs実行空間を共有できること
・postExecMacroMemoryがあること
が、この実装の難度をかなり高めそうです

そうなると結局、今やってる

const currentMacroDirectory = currentmacrodirectory();
を先頭付近に書いてそれを使ってください、
が一番難度が低いのかなぁ...

[ ]
RE:10600 非同期にしたほうが良さげ関数シリーズNo.10602
秀丸担当 さん 25/02/28 10:13 [ コメントを投稿する ]
  ご意見ありがとうございます。
参考にさせていただきます。
[ ]
RE:10602 非同期にしたほうが良さげ関数シリーズNo.10627
こみやんま さん 25/03/06 11:07 [ コメントを投稿する ]
  あと、

■filter 

特に「引数4つ以上の方」は非同期実行が出来たほうが、jsの考え方や実装と相性がよくなるかと。
「変換モジュール」をJSの比較的強力なマッチング機構とコールバックの仕組みに自然な形で乗せやすくなります。

var rs = s.replace(/あああ/g, function(ma) {

   return filter("module", "method", "opt", ma);

   // 現在のような同期関数だと「うーん」だが、
   // 非同期&ネイティブならマッチ時のコールバックと相性がかなり良くなる

});

■begingroupundo endgroupundo 相当のもの

今のままだと個々の関数を非同期にしても、
「CTRL+Zで元に戻る」の辻褄を考えると
begingroupundo endgroupundo を利用しておきたいがために、
同期実行が必要になるので、postExecしがちになるかと。

そこで、これを非同期にする感じ。
(とはいえ、原則、下のfinallyのように必ず挟み込んで確実に実行されるスタイルの記述が要求されるかとは思います)
try {
    begingroupundo();
    ・・・なんか秀丸の編集エリアに関わる複数の処理
}

finally {
    endgroupundo();
}

マクロの仕様として、「同期」実行中に「非同期」functionが実行されないことが担保されているので、

・「同期」は「同期内でbegin/end」しろ、
・「非同期」は「非同期内でbegin/end」しろ、
という記述側でのカバーは必要になるかとは思います。

[ ]
RE:10627 非同期にしたほうが良さげ関数シリーズNo.10628
秀丸担当 さん 25/03/06 12:33 [ コメントを投稿する ]
  ご意見ありがとうございます。
参考にさせていただきます。
[ ]

[ 新規に投稿する ]