V9.19β7(バージョン番号変更)No.10971
秀丸担当 さん 22/08/29 15:45
 
V9.19β7を公開しました。

バージョン番号をV9.18βからV9.19βに変更しています。
V9.18のほうは、V9.17をベースにバグ修正だけをしたバージョンとして、近いうちに
V9.18正式版にします。
ややこしくて申し訳ありません。

以下のページの「先行開発バージョンはこちら」からダウンロードできます。
https://hide.maruo.co.jp/software/hidemaru.html

32bit版:
https://hide.maruo.co.jp/software/bin3/hm919b7_signed.exe

64bit版:
https://hide.maruo.co.jp/software/bin3/hm919b7_x64_signed.exe

[ ]
RE:10971 V9.19β7(バージョン番号変更)No.10972
こみやんま さん 22/08/29 16:35
 
スクリプト空間の記述をヘルプにしっかい書いたほうがよさそうです。

■マクロ空間は自由に設定できる

まず、ライブラリ的なものではなく、ユーティリティ的なマクロの場合

jsmode "JScript";
jsmode "WebView2";

ではなく、以下のどちらかを書いて、その独自の空間の中で実行するのが行儀がよい
ということ

jsmode @"JScript\" + currentmacrofilename;
jsmode @"WebView2\" + currentmacrofilename;

こうすることで、仮にJSのマクロ空間が汚れていてもその影響は受けないし、
また、自分自身のマクロでJS空間を汚しても、他のマクロに影響を与えない。
影響があるのは、まさに currentmacrofilename でのJavaScript空間のみになる。




■「空間を掃除する意図で、jsmode ""」の多様は禁物。
 今はまだいいが将来はおそらくあまり(というか事実上)使えなくなるかも。

 jsmode "" は名前空間の変数をクリアせよ、という意味だけでなく、
 該当プロセス内にある「全ての非同期中のJavaScriptの実行も中止して、かつ名前
空間もクリアする」といった意味も含んでしまう。

 問題となるのはまさに
 ```
 全ての非同期中のJavaScriptの実行も中止
 ```
 ということ。

 この副作用を考慮すると、「空間のクリア」の目的でjsmode "" は使えず、
 「何かわからんが全部停止してください」という
 非常用途の緊急使用といった方向性になりそうです。



[ ]
RE:10971 V9.19β7(バージョン番号変更)No.10974
こみやんま さん 22/08/29 18:07
 
「nodeのchild-processに似たような何かが必要だと思います」と、投稿しようとし
たら、
hidemaru.runメソッドみたいなのを作成しようとされているので、待ちたいと思いま
す。

簡易的なものはそもそもで、すでに秀丸マクロのラップとなっているrun**系がある
ため、
狙いはやはり、
・外部プロセスとのconnet/disconnect
・RedirectStandardInput/RedirectStandardOutput/RedirectStandardError とJavaS
cript関数の結びつけ(やコールバック関数を渡す形)

Input/Output/Error は随時行える。


といったものでしょう。

C#のProcessクラスのインスタンスとイベントハンドラーが
(Win系ライブラリでは)これらを最もスマートに扱えていると思いますが、
JavaScriptだと node の child-process (https://nodejs.org/api/child_process.h
tml)あたりになろうかと思います。

(今、担当さんが制作されている JavaScriptのhidemaru.run(...)もあるていど上記
に近い方向性のものを簡易化したものであろうと感じます。





[ ]
RE:10972 V9.19β7(バージョン番号変更)No.10975
秀丸担当 さん 22/08/30 09:14
 
ご意見ありがとうございます。
jsmodeの名前空間的なことはヘルプのどこかに書いておこうと思います。
jsmode ""で全部クリアは、似たようなことを感じていました。
仕様変更して、jsmode ""は現在実行しようとしているものだけクリアということに
して、全クリアは別に用意してもいいかもしれません。

[ ]
RE:10975 V9.19β7(バージョン番号変更)No.10976
こみやんま さん 22/08/30 09:56
 
ほとんどのJavaScriptはOnce側(秀丸マクロをJavaScript文法で書く)みたいな使い方
でしょうから、


@スクリプトの名前空間をしっかりつける、

という前提でjsmode関数を用意して、

#jshandle = jsmode(EngineName+NameSpace:string, isCopyGlobal );

js {
    ....
}

clearjsmode(#jshandle); // freejsmodeとかreleasejsmodeとか

みたいなのが第一感では浮かびます。

ただし、これだと、実行しないと値がわからないので、
別ファイルになるとめんどくさいでしょう。


と、なると、

jsmode(namescope:string, isCopyGlobal );

clearjsmode(namescope:string); でnamescopeが一致するもんだけ停止&クリアしま
すよってやった方がいいかもしれないですね。



文字列ベースにしておけば、エントリーファイルで開始して、postExecMacroFile の
特定の条件でのみ停止する場合などは、


jsmode( @"WebView2\MyAppName.MyHandleName" );

js {
}

どこか特定の条件下で呼ばれる
別ファイルで、

clearjsmode( @"WebView2\MyAppName.MyHandleName" );

みたいにやれるようになりますかね。

他と衝突することを強くさける必要がある、常駐型などは、
ある程度スキルもあるでしょうし、MyAppName.MyHandleNameの代わりに、
GUIDか何か突っ込んでくるでしょう。






[ ]
RE:10971 event() という関数名はまずいNo.10977
こみやんま さん 22/08/30 19:13
 
定義ファイルで波線出てるので内容を参照すると、
lib.dom.d.ts にも定義されている、と出ています。

前後を見ると
declare var closed: boolean;
/** Defines a new custom element, mapping the given name to the given constr
uctor as an autonomous custom element. */
declare var customElements: CustomElementRegistry;
declare var devicePixelRatio: number;
declare var document: Document;
/** @deprecated */
declare var event: Event | undefined;
/** @deprecated */
declare var external: External;
declare var frameElement: Element | null;
declare var frames: WindowProxy;
declare var history: History;
declare var innerHeight: number;
declare var innerWidth: number;

といったことになっていて、window.event というのがあって、
windowはグローバル相当だから、

event = function みたいな書き方だと、
WebView2の方は、window.event に代入しちゃってるかと。

そこに代入してしもうてるかどうかのチェックソース
-----------------------------------------
jsmode "WebView2";

js {
    message(window.event.toString());
}
-----------------------------------------

window.event が明らかに hidemaruGlobal.event を指してしまっている。

[ ]
RE:10977 event() という関数名はまずいNo.10979
こみやんま さん 22/08/30 19:55
 
>定義ファイルで波線出てるので内容を参照すると、
>lib.dom.d.ts にも定義されている、と出ています。
>
>/** @deprecated */
>declare var event: Event | undefined;

https://developer.mozilla.org/ja/docs/Web/API/Window/event

も合わせてみると、 deprecated だから名前避けずに、
今のままでwindow.eventをすり潰していいかも。

[ ]
RE:10979 postExecMacroFile のヘルプミスNo.10980
こみやんま さん 22/08/31 07:48
 
postExecMacroFile の引数説明や返り値説明などが間違っている


・引数や返り値の説明が間違っている(isMacroExecutingのコピペのまま修正しわす
れたと思われる)
・「マクロ実行中でも」利用可能である(実際に最初の例がそう)




[ ]
RE:10976 V9.19β7(バージョン番号変更)No.10981
秀丸担当 さん 22/08/31 09:17
 
ご提案ありがとうございます。
jsmode "";では全てリセットせず、次に実行するものだけがリセット状態となるとい
うことにしてみようかと思います。

  jsmode "";
  js{... }

あるいは

  jsmode "";
  jsmode "WebView2";
  js{... }

あんまり文が増えるのも何なので、全リセットはjsmode "allreset";にしてみます。

[ ]
RE:10980 postExecMacroFile のヘルプミスNo.10982
秀丸担当 さん 22/08/31 09:19
 
ヘルプのご指摘ありがとうございます。直しておきます。
event()は被っていたのですね。
ですがブラウザのほうは非推奨ということで、放置ということにしてしまおうと思い
ます。

[ ]
RE:10982 eventNo.10983
こみやんま さん 22/08/31 09:31
 
>event()は被っていたのですね。
>ですがブラウザのほうは非推奨ということで、放置ということにしてしまおうと思
>います。

ただ、Chromeで何かイベントがあると、おそらくwindow.event にEvent型の値を突っ
込んでくると思いますので、
WebView2もChromeと同じですので、event関数は、
WebView2側から window.event を上書きされてしまうかと思います。
(秀丸が上書きしたwindow.eventに逆に、WebView2側から特定条件で上書きしてくる)

対策としては、HidemaruJSGlobal内のlockInHg に event を追加し、
かつ、eventだけはnew Errorはしない。
エラーを出さないようにしておいたほうがいいと思います。

そうするかどうかは、将来秀丸エディタで、
VSCodeのようにWebView2を利用した「ブラウザペイン」みたいなものを用意するかど
うか、
その用意したものと、jsmode WebView2でjs経由で対話する予定かどうか
に関わっているかと思います。

いずれにしても 何かブラウザイベントがあると
非推奨であっても(ブラウザ側の互換機能として、
windows.event には Event型の値が突っ込まれるんだと思います。


[ ]
RE:10983 他に気づいている点No.10985
こみやんま さん 22/08/31 09:52
 
■被り系
・WebView2において、print が window.print と被っている点。
 「秀丸エディタ」を印刷するか、「ブラウザペイン」を印刷するのか、といった話
になるので、
 どくかどうかは、「ブラウザペイン」を用意し、そことjsmode - WebView2 がスク
リプト対話するかどうかにかかっている。
 対話しないのであれば、window.print の元の関数はほとんど意味をていしていな
いので、放置でOKかと。


■isMacroExe..., post... post...
 の3つの関数がグローバルにはコピーされていない点。
 意図的なのか忘れてるのか判断が付かなかったので投稿しなかったですが、一応の
お知らせです)

[ ]
RE:10985 他に気づいている点No.10986
秀丸担当 さん 22/08/31 10:56
 
printも被るということで、そっちメインにしていくか必要性がある場合は、グロー
バル展開をやめるといいので、基本的にグローバル展開してエラーにならないのなら
放置でもいい気がします。
ブラウザペインはいずれやろうと思います。
ペインというよりフローティングもできるUI部品的なものにも使えたらいいです。
(漠然と)

グローバル展開するのはhidemaruGlobalのものが基本で、hidemaruオブジェクトのほ
うはsetVarとか特にあったほうがいいものだけにするつもりでした。
hidemaruオブジェクトはシンプルにするつもりでしたが、いつの間にか増えてきて、
なんだか増えそうな気がしてきています。
runが既に自身のrunと被っていますし…
非同期で呼ばれたとき、いちいちpost...せずにすぐ使いたいものがあったらそれで
増えてしまいそうです。

[ ]
RE:10986 他に気づいている点No.10987
こみやんま さん 22/08/31 11:35
 
> 非同期で呼ばれたとき、いちいちpost...せずにすぐ使いたいものがあったらそれ
>で増えてしまいそうです。

そうなんですよねー、C#系C++系以外は、(hmJS/V8/Python3)など非同期系の口をカッ
トしたのも
理由はここでした。
(非同期中は道具が貧弱になって身動きとれないでしょうっていう)

hidemaru.***シリーズだけでは、編集ペインの変化を捉えることすら困難だろうから
イベントを発生させること自体が難しいかと。

今の仕様ですと、非同期中に編集ペインの状況を判定をするためには、
Hidemaru_***シリーズをC++かC#でdllかcomかにして
「常時使用可能な関数として」それをjsで使うみたいな
形になると思うんですよねー

[ ]
RE:10971 自分自身の名前空間を取得する関No.10988
こみやんま さん 22/08/31 16:35
 
js側から、jsmode の第1引数(ようするに名前空間)の部分の文字列が取れたほう
がいいかなーと思いました。

名前空間をちゃんと分けて使う方向性になるのであれば、
それをpost系に橋渡ししていきたいだろうなっと。


又、postExecMacroFile に第2引数以降を与えると、
該当のmacに引数を与えたこととなり、秀丸マクロのgetarg関数で取得できるように
するのが良いように思えました。

仮に、そのような関数を
```
hidemaru.getJSScopeName(): string
```

だとして、


jsmode "WebView2\\MyApp.Handle";

js {
    var myscope = hidemaru.getJSScopeName();
    postExecMacroFile(currentmacrodirectory + "\test.mac", myscope);
   
}

〜〜〜〜〜〜

jsmode "WebView2\\MyUtility.Fungaaa--";

js {
    var myscope = hidemaru.getJSScopeName();
    postExecMacroMemory(`
        jsmode ${myscope};

        js {
            ....
        }
    `);
}

-----------------------test.mac----------------------------

if (getarg[0] != "") {
    $scope = getarg[0]; // 同じ空間に対して作用することで、続き的な処理が書ける
} else {
    $scope = "WebView2";
}

jsmode $scope;

js {
   ...;
}



}

[ ]
RE:10988 自分自身の名前空間を取得する関No.10992
秀丸担当 さん 22/09/01 09:59
 
自分自身がいまどういう状態で動いているのか知りたいというのはあるかもしれませ
ん。
他のマクロの受け渡しとかはまあ、やり方は何でもあるとは思いますが、もし複数実
行するようになったときに、本当にそれで動いているのか確認したいということが出
てくるような気もします。
そういうのも検討しようと思います。

[ ]
RE:10992 自分自身の名前空間を取得する関No.11000
こみやんま さん 22/09/01 19:55
 
ヘルプに記載している名前空間の件ですが、2番目の引数である「0」と「1」でも
これが違うと名前空間も別になってしまうということも
記載しておいたほうが良い気もします。


すなわち、

jsmode "WebView2";

{
   hidemaruGlobal.なしで色々書いた
}


jsmode "WebView2", 0
{
  // ここだけ 何かと衝突しそうだからといって、hidemaruGlobal. をつけて
   // 上の続きを記述しようとしても、そんなことは出来ないよっと
  // 上とは変数が繋がらない、別空間となってしまう
}

[ ]