hidemaru.getJsMode の戻り値No.11742
h-tom さん 24/07/15 22:28
 
h-tom です。

秀丸エディタ:Ver9.37β2(64bit版)
OS:Windows11(23H2) 64bit

hidemaru.getJsMode() の戻り値で確認です。
jsmode文で名前を指定しないと、開いているファイルのパスが含まれる文字列が返っ
てきますが、これが正しい動作なのでしょうか?
(スコープという意味では間違ってはいないのですが、jsmode文で指定した文字列が
返ってくると思っていたので)

//確認用マクロ ここから
$jsname[00]="JScript";
$jsname[01]="JScript\\test";

#jsflg[00]=1;
#jsflg[01]=1;

debuginfo 2;
#max = 2;
#cnt = 0;
debuginfo sprintf("filename=%s\n", filename);
while(#max > #cnt){
    debuginfo sprintf("No.%02d:", #cnt);
    jsmode $jsname[#cnt], #jsflg[#cnt];
    js{
        console.log("jsmode=" + hidemaru.getJsMode());
    }
    #cnt = #cnt + 1;
}
endmacro;
//確認用マクロ ここまで

//出力結果
filename=d:\temp\check.txt
No.00:jsmode=jscript\d:\temp\check.txt\<global>
No.01:jsmode=jscript\test\<global>

[ ]
RE:11742 hidemaru.getJsMode の戻り値No.11743
こみやんま さん 24/07/15 23:27
 
>> jsmode文で名前を指定しないと、開いているファイルのパスが含まれる文字列が
>返ってきますが、これが正しい動作なのでしょうか?


これは想定通りと思いますよ。


jsmodeの実行空間は、その実行空間は
「そのプロセスで『開いているファイル名』」に紐づけされていて、
「プロセス」に「直接ぶら下がっているわけではない」こともあり、

@「具体的な指定」があれば、その文字列
A具体的な指定がない場合、ファイルを開いていれば、そのフルパス
Bファイルを開いていない場合(無題の場合)、カレントフォルダ

で、hidemaru.getJsMode()の返り値としては、
```
「エンジン名」\「@|A|B」\「<global|strict>
```
になっているかと思いますよ。

(※getJsModeのヘルプに書いてないやんけぇ問題はありますが)


個人的には当初はこれで良かったですが、現在では設計としてやや失敗ぎみで、
何も指定がなければ、
「開いているファイル名(or カレントフォルダ)」+「実行マクロファイル名(をベー
ス)」にするべきだったのではないか? とは思いますね..

(非同期が後で加わったので名無しの場合の実装がやや失敗ぎみになってしまった感)

[ ]
RE:11743 hidemaru.getJsMode の戻り値No.11745
秀丸担当 さん 24/07/16 15:21
 
getJsModeの戻り値は、確かにそのようになっていました。
最初の\までがスクリプトエンジンで、それ以降はスコープを識別する何らかの文字
列ということにして、ヘルプは記述内容を明確にはしないでおこうと思います。

[ ]
RE:11745 hidemaru.getJsMode の戻り値No.11751
h-tom さん 24/07/22 23:10
 
h-tom です。

>getJsModeの戻り値は、確かにそのようになっていました。
>最初の\までがスクリプトエンジンで、それ以降はスコープを識別する何らかの文字
>列ということにして、
>ヘルプは記述内容を明確にはしないでおこうと思います。
了解です。

もう一点。

jsmode "allreset";
を実行した後に、hidemaru.getJsMode() を使うと、エンジン部分が "allreset" に
なっている文字列が返ってきます。
動作しているのは「JScript」ですよね?

//動作確認用マクロ ここから
newfile;
debuginfo 2;
jsmode "JScript";
js{
    console.log("jsmode(0)=" + hidemaru.getJsMode());
    var name = "hidemaru";
    console.log("name(0)  =" + name);
}
jsmode "WebView2";
js{
    console.log("jsmode(1)=" + hidemaru.getJsMode());
    var name = "HIDEMARU";
    console.log("name(1)  =" + name);
}

jsmode "allreset";
js{
    console.log("jsmode(2)=" + hidemaru.getJsMode());
    if(typeof(name) === "undefined"){
        console.log("name(2)  =宣言されていません。");
    }else if(hidemaru.getJsMode().indexOf("webview2", 0) == 0 && name == ""){
        console.log("name(2)  =''です。宣言されていないか、空文字がセットさ
れています。" );
    }else{
        console.log("name(2)  =" + name);
    }
}
endmacro;
//動作確認用マクロ ここまで

//出力結果 ここから
jsmode(0)=jscript\c:\temp\\<global>
name(0)  =hidemaru
jsmode(1)=webview2\c:\temp\\<global>
name(1)  =HIDEMARU
jsmode(2)=allreset\c:\temp\\<global>
name(2)  =宣言されていません。
//出力結果 ここまで

[ ]
RE:11751 hidemaru.getJsMode の戻り値No.11752
秀丸担当 さん 24/07/23 09:05
 
ご指摘ありがとうございます。
"allreset"とした後getJsModeが"allreset"から始まる文字列となるのは、確かにお
かしかったです。
この場合JScript相当となるように修正させていただきます。

[ ]