V9.18β1No.10840
秀丸担当 さん 22/07/14 10:30
 
V9.18β1を公開しました。

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

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

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

マクロのjs{ ... }という記述の中で、JavaScriptを書けるようにしています。

通常は、WSH(Windows Script Host)によるJScriptの方式で、秀丸ファイラーClassic
で以前からやっている方式と同じです。

スクリプトエンジンを指定できて、ちょっと特殊かもしれないですがWebView2も指定
できるように試しています。
WebView2は、Chromium版Edge相当のブラウザをアプリに組み込むものに相当して、Wi
ndows11か、Windows10の一般向けにも更新で適用されるようになっているようです。
このうちスクリプト部分だけ使うものです(現時点で)。最初の起動が遅いです。
とりあえずWebページは見ることができないようにしてあります。

詳細はマクロヘルプのJavaScript対応のページにあります。
仕様がまだ定まり切っていないところもあるので、ご意見いただけたら幸いです。

[ ]
RE:10840 V9.18β1No.10841
こみやんま さん 22/07/15 05:30
 
マクロ史上一番大きな追加機能きましたねー

細かくは見ていないですが、

■実行してみた
・JScriptとEdgeV8の両方で小さなサンプルが動作するのは確認
・execjs や、 複数のjs{ } で スクリプト空間が継続することを確認
 (letなら js{ }を跨がないことを確認)

■戸惑ったこと
・実行エントリー用の「.jsファイル」に「秀丸マクロ」と「JavaScript」が交じるで、
 若干どうかなーという感じ
 execjsで呼ぶJSには混じらないので(しかし実行JavaScript/マクロ空間としては継続)
 同じ.jsで異なるので戸惑うかも
 (要するにjavascriptファイルではないものに.jsという拡張子をつけるので
  他のエディタJS編集するにせよ、秀丸で編集するにせよ、入力補完や強調表示に
支障がでるのでは...)

■備考
・このjs関連マクロをいろいろ実行したあと、Chrome実行した瞬間、2年ほど見てい
なかったブルー画面が出たのが気になる...
 (再発しなので秀丸のせいかどうかは全く不明です)

[ ]
RE:10841 V9.18β1No.10842
こみやんま さん 22/07/15 05:33
 
とおもったら、別に.jsでなくてもいいみたいですね。

[ ]
RE:10842 V9.18β1No.10843
こみやんま さん 22/07/15 06:20
 
64bit版の整数版で、JS数値が32bit超えると値が0になっているようです。

//----------------------- HidemacJs.dll -----------------------

jsmode "WebView2", 1;

js {
a = 2147483648; // 2147483647 の int32t.MAX/MINまではうまくいくがそれを超え
ると0になる
hidemaru.SetVar("#a", a);
}

message str(#a); // "0"になってしまう


//----------------------- hmV8 -----------------------

#V8 = loaddll(hidemarudir + "/hmV8.dll");

#_ = dllfuncw(#V8, "DoString", R"V8(

hm.Macro.Var["#a"] = 999999999999993333;

)V8");


freedll(#V8);

message str(#a); // 同じV8エンジン使用だが、"999999999999993333" 64bit伝達

[ ]
RE:10843 V9.18β1No.10844
秀丸担当 さん 22/07/15 10:39
 
早速のご意見ありがとうございます。

js{...}の場合は拡張子.macのままで、その中で書くことを想定しているのですが、e
xecjsの場合は、呼び出されるものは拡張子.jsでいいかなと思っていました。
WebView2で世に出回るライブラリ的な.jsをそのまんま使えたらといいと思っていま
すが、やりすぎかもしれないです。
拡張子は何でもいいので、秀丸エディタ上での表示のためには、状況に応じて変えれ
ばよかったです。

ブルー画面は、ちょっとわからないですが、hmV8.dllのマクロを見てjs{}の中からそ
れ自体を呼んだらどうなってしまうのかと試してみたら、全然だめでした。(ブルー
画面の話とは別かもしれないですが)
js用のhidemaru.LoadDllからのDLL読み込みは、本体とは別の空間のため、その中のH
idemaru_EvalMacroとの組み合わせでまずかったです。
実行されると落ちるか不安定な状態になってしまうので、制限するかサポートするか、
とにかく不安定な状態にならないようにします。

数値変数とのやりとりは、いまのところ32bit値に切り詰めています。
今は64bitや浮動小数点数版のエディションによってマクロが違うという問題があり、
jsではそのへん気にせずに共通化できたらいいです。
必要時は文字列で受け渡しでなんとかならないかと思っています。

[ ]
RE:10844 V9.18β1No.10845
こみやんま さん 22/07/15 20:06
 
OutputPaneやExplorerPaneをLoaddllしても今はまだ機能しないでしょうか。

jsmode "WebView2", 1;

js {
 let dll = loaddll("HmOutputPane.dll");
 let fn = dll.DllFunc;
 let handle = hidemaruhandle(0);
 message(handle);
 message(fn.toString());
 let n = fn.Output( handle, "123 abc" );
}

js {
 let dll = loaddll("HmExplorerPane.dll");
 let fn = dll.DllFunc;
 let handle = hidemaruhandle(0);
 message(handle);
 message(fn.toString());
 let n = fn.GetMode( handle );
}

message $a;

[ ]
RE:10844 V9.18β1No.10846
こみやんま さん 22/07/16 02:26
 
>js{...}の場合は拡張子.macのままで、その中で書くことを想定しているのですが、
>execjsの場合は、呼び出されるものは拡張子.jsでいいかなと思っていました。

これでOKだと思います。

execjsから呼ばれるものは、.jsファイルの文法で構成されますし。
(JavaScriptには存在しない独自の関数やオブジェクトがアプリ側からJS空間に追加
されているのは、「ブラウザ」も「node」も同じことですし)

[ ]
RE:10845 V9.18β1No.10847
こみやんま さん 22/07/16 02:46
 
>OutputPaneやExplorerPaneをLoaddllしても今はまだ機能しないでしょうか。
「WSHによるJScriptのみ」とありました。 うーん、なるほど、うむむ...

[ ]
RE:10847 V9.18β1No.10850
秀丸担当 さん 22/07/19 10:22
 
hidemaru.LoadDllは、いまのところJScriptだけになっていました。
ややこしくてすみません。
秀丸のオブジェクト側は同じなので、WebView2でもできるかと思っていたのですがな
ぜかできなくて、エラーメッセージを出すように修正しようかと思っていたところで
した。
ですが、調べてみて、やり方が違うだけでできることがわかりました。
WebView2でもできるようにします。

hidemaru.LoadDllから呼び出されているときのHidemaru_EvalMacroによるdllfuncも、
できるようにします。

[ ]
RE:10850 V9.18β1No.10854
こみやんま さん 22/07/21 21:09
 
■3時間ほど触ってみて、ラッパーを作るといった最初の枠のところをやってみまし
た。
 受けた印象は、将来の展望は明るいのではないか、といった印象です。

 秀丸マクロの一番問題だった「汎用ライブラリ化しにくい」問題が
 大きく解消できています。
 しかし、まだ改善点が多くなりそうといった印象です。

 https://github.com/komiyamma/hidemaru_jsmode_test_01


[ ]
RE:10854 V9.18β1No.10855
こみやんま さん 22/07/22 09:56
 

hidemaru.SetVar("#a", true);

 とすると、#a に -1 がセッティングされるようです。

boolean 型を秀丸マクロの数値型へとSetVarした場合、
true → 1, false → 0 に マッピングした方がよいかと思います。

[ ]
RE:10855 V9.18β1No.10857
秀丸担当 さん 22/07/22 13:58
 
いろいろありがとうございます。

require的なことは、js{}内でもexecjsできたらいいかと思っていたり、実はフルパ
スでできたりしているのですが、evalしているだけで、はたしてサポート範囲に含め
ていいものかと思っています。
jsonをevalするのはコードが含まれるかもしれないので、WebView2で組み込みオブジ
ェクトとしてJSONでするのがいいようです。

グローバルの展開は衝突の可能性があるので、基本的にはhidemaruオブジェクトだけ
で、任意でグローバルという位置づけにしています。
でも結局のところ書きやすさから常時グローバルにしてしまいがちなので、hidemaru
オブジェクトか何か別の衝突を避ける書き方でも両立できたらいいです。

SetVarでtrueにしようとすると、確かに-1でした。この場合は1となるようにしよう
と思います。
if(xxx()==true)としているような場合など、吸収しきれないところもあるので、成
否を表すときは0か0以外かといったような表現にして、そっち方面に促していこうか
と思います。

[ ]
RE:10857 V9.18β1No.10860
こみやんま さん 22/07/26 10:49
 
■unicodeキーワードの順序位置っぽいところにunicode関数が(秀丸内部的に)定義
してある

現状のいわゆる jsmode 1 等で登録される関数は、以下のものであろうと思われます
が、
(おそらく秀丸担当さんが内部的に並べている通りの並びにかなり近く並んでいるの
ではないのかなとは思いますが)
上から見ていっていますが、function unicode(text: string): number は
秀丸マクロ的は unicode キーワード と unicode 関数がありますが、位置的にはマ
クロのunicodeキーワードを採用しようとしたかのような
位置にありますが、実際の実装としてはマクロのunicode関数の実装となっているよ
うですが、
これはunicode関数のみを選んだ、ということであっていますか(一応の確認のみです)

https://github.com/komiyamma/hm_jsmode_print_functions

■キーワードにxxxx[ix]付きでアクセスするものは全部 xxxx(ix) の法則?

 たとえば、
 秀丸マクロ:linelen2[ix]
   → JavaScript:linelen2(ix);

 であってますかね。多分そのハズだとは思っています。  


■TypeScript/ECMAScript 定義ファイルもうちっと作成してみました。
  (まだ全体の10%-15%くらいだと思いますが...)

  https://github.com/komiyamma/hidemaru_jsmode_test_01/blob/main/src/HmCompatLib.d.ts

 当初想定した通りいい感じに機能しそうです。


■関数の定義や補完定義作成(あるいは生成)はどのような方針ですか?(漠然と)

jsmode 1 の関数登録と呼び出し部分は、おそらく、裏でeval内(?)でフックがされて
いて、
 mの関数名と、fnやstやstary といった突如でてくる変数「名」等に基づいて、
 argumentsなども含めてフックしているものと思っていますが、
 https://github.com/komiyamma/hm_jsmode_print_functions

 ほとんどは以下のように引数を明示しない形で定義されています。
 (返り値の型も明示はしていませんが、stだのfnなどの2文字目がその型を表して
いることはわかります)
  ```
 function() {/*括弧を付けて呼んでください*/var m = "disableinvert"; eval(**
*); return r; }
  ```

 ・ここってこの定義部分の層は今は引数とかほぼついていない(おそらくarguments
で裏で引っ張ってる)
   範囲の層で最終的には引数とかなんとなくわかるようにする方向ですか?

 それとも入力補完や分析用の秀丸用なりVSCodeなりの「外部定義ファイル」とヘル
プで
 入力していって〜 といった方向の想定ですか?
 

[ ]
RE:10860 V9.18β1No.10861
こみやんま さん 22/07/26 11:21
 
■エラーがスルーされすぎている


jsmode "WebView2", 1;

js {
    message("OK");
    let e = 3;
        if (e == 3 {
    }
    message(ret);
}


(※ 各種カッコの対応がとれてないのはワザとです)


このくらいでもエラーが全くでないのは、「JS層パース」の前に起きる「秀丸マクロ
層」のパースで
何かゴッソリ奪われているからなのでしょうか。

V8層だけだと、もちろん余裕でsyntax error等が出るハズなので、
簡単に解決したがい根が深い問題があるのかなぁと。


[ ]
RE:10861 V9.18β1No.10862
こみやんま さん 22/07/26 13:28
 
■命名規則見直し提案

JavaScriptで、「これは関数だな」とか直感的によりわかりやすいように
関数とプロパティはキャメルケースに統一した方が良いように思えます。(JSの文化
に合わせておく)

秀丸マクロの「関数」「文」「キーワード」のものは、「小文字統一はそのまま小文
字統一」として(これはできるだけ転写が望ましいと思うので)
そうではないものは、JS文化に従っておいた方が無難なように思えます。

具体的には以下のものです。

function EvalMacro(...)
→ evalMacro(...) (関数はキャメルケース)


function EvalJS(...)
→ evalJS(...) (関数はキャメルケース)

hidemaru.CreateObject
→ hidemaru.createObject (関数はキャメルケース)

hidemaru.LoadDll
→ hidemaru.loadDll (関数はキャメルケース)


hidemaru.EvalMacro
→ hidemaru.evalMacro (関数はキャメルケース)

hidemaru.GetVar → hidemaru.getVar (関数はキャメルケース)
hidemaru.SetVar → hidemaru.setVar (関数はキャメルケース)

var ret = hidemaru.loadDll("...");

ret.DllFunc
→ ret.dllFunc (プロパティはキャメルケース)

同じく
→ ret.dllFuncW
→ ret.dllFuncStr
→ ret.dllFuncStrW


hidemaru.LoadTextFile
→ hidemaru.loadTextFile (関数はキャメルケース)

[ ]
RE:10862 V9.18β1No.10863
秀丸担当 さん 22/07/26 14:10
 
グローバルの一覧を出すような方法があるのですね。
一覧の位置は、自分の書いたところと似た感じの部分もあれば、全然違うところもあ
るようで、その順序は何なのかわからないです。
順序はどこでもいいですが、unicodeは、キーワードとしてのunicode()と、関数とし
てのunicode(str)でもどちらでもできるようにしてあります。

キーワードで[]を付けるようなものも、()にすれば大丈夫です。
この件もグローバルのヘルプところに書いておきます。
というか、実はjsでなくても、もともと#a=linelen2(#n);のように書けてしまいます。

グローバルは、現状、文字列化して見えてしまっているようにJavaScriptの関数で簡
単に置き換えているだけのものです。
グローバルに展開すること自体もオーバーヘッドで、JavaScirpt関数の呼び変えも
オーバーヘッドで、全然高速ではないです。
今後の動向次第ではもうちょっとネイティブ寄りの実装に置き換えていくかもしれな
いですし、文字列化されるとも限らないです。
実装方法を置き換えていったとしても、表面的な振る舞いは同じようにするつもりで
す。
この文字列化によってパラメータがわかるようにするとか、そういったことは無いで
す。


エラーは可能な限り出すようにしたいのですが、エラーが出ない場合がけっこうあっ
て、どうしたものかと思っています。
一応、件のシンタックスエラーは、JScriptではエラーになるようです。
WebView2では何にもエラーにならず正常に終わるだけに見えることがあって謎です。
エラーにならない場合は、全体をeval(JavaScriptのeval)で囲うと、一応その範囲に
文法エラーが存在するかどうかの判別は可能なようです。

//JScriptはエラーになる
jsmode "JScript";
js {
    var e = 3;
        if (e == 3 {
    }
}
endmacro;

//WebView2でもエラーになる ReferenceError
jsmode "WebView2";
js {
    eeerrr;
}
endmacro;

//WebView2でもエラーになる  SyntaxError
jsmode "WebView2";
js {
    eval('eeerrr');
}
endmacro;

//↑このevalでできたのを踏まえて、WebView2で無理やりエラーにしてみる
jsmode "WebView2";
js {
eval(R"SYNTAX_ERROR_TEST(
    let e = 3;
        if (e == 3 {
    }
)SYNTAX_ERROR_TEST");
}
endmacro;


命名規則について、ご提案ありがとうございます。
秀丸マクロにもともとあるもの以外は、最初が小文字のキャメルケースにしたほうが
いいかもしれません。
いまのうちにそうしておこうかと思います。

[ ]
RE:10863 V9.18β1No.10864
こみやんま さん 22/07/26 22:04
 
■JavaScript版のgeteventparam 様子がおかしいかも。

定義的にも返り値が「数値」or「文字列」ではなく、常に文字列返すような定義にな
っている可能性があるかと。

jsmode "WebView2", 1;

js {
   let ret = geteventparam(0);
   var t = typeof(ret);
   message(t);
}

エラーも起きるように思えます。

[ ]
RE:10864 V9.18β1No.10865
秀丸担当 さん 22/07/27 09:24
 
ご指摘ありがとうございます。
確かにその通りで、getresultex, getconfig, geteventparamの3つは文字列と数値
のどちらでもありえるため文字列固定にしていました。
しかしそれだと数値が返っているときにうまくいっていませんでした。
どちらでもできるように修正します。
とりあえずJavaScriptの関数上で吸収させようと思いますが、いずれ直接実装にする
かもしれません。

[ ]
RE:10865 V9.18β1No.10866
こみやんま さん 22/07/27 09:49
 
■JavaScriptのcreateobjectの不備

JavaScript番のcreateobject (= hidemaru.CreateObjectも)において、
パスも指定するタイプが機能していないと思われます。

https://github.com/komiyamma/hidemaru_jsmode_test_02/blob/main/test_02.mac

ProgIDやClassID単発ではなく、
パスも指定することで、対象ファイルの対象クラスがレジストリ登録されていない際、
その対象クラスを自動的にレジストリ登録する秀丸の機能(HmResident.exe相当機能)
へと繋がっているので、
createobjectにパスを指定するタイプの対応も必要かなと思います。


[ ]
RE:10866 V9.18β1No.10867
こみやんま さん 22/07/27 09:53
 
>■JavaScriptのcreateobjectの不備
>(HmResident.exe相当機能)へと繋がっているので、

HmResident.exe ではなく HmRegasm.exe

[ ]
RE:10867 V9.18β1No.10868
秀丸担当 さん 22/07/27 12:58
 
jsmode 1でのjs{}内createobjectは確かにパラメータ2つ渡しではありませんでした。
hidemaru.createObjectに呼び変えて2つ渡せるようにします。

hidemaru.createObjectについては、パラメータ2つに対応しているはずです。
ですがうまくいかないパターンもあるようでした。
1つは、C#のlongは64bitのようで、32bit版でも通用させるにはintでないといけな
いようです。
もう1つ、WebView2のオブジェクトのメソッド呼び出し(COMのIDispatch)はクセが
あるようでE_INVALIDARG (0x80070057) になってしまうようです。
JScriptだと大丈夫でした。

当初、hidemaru.loadDllがWebView2に対応できていなかったのもIDispatchの呼び出
しがなんか変だったためで、これは自前のIDispatch実装なので、対応できました。

WebView2とdotnet4.xの間では立ち入る隙が無いので、どうにもできなさそうです。
JScriptを使うか、従来の秀丸マクロの方式しかなさそうでした。

[ ]