Hidemaru Q and A

第III部〜秀丸マクロのいろはにほへと
 JavaScript対応


JavaScript対応

はじめに

Ver.9.19以降、マクロファイル内にある、js{ } 記述内は JavaScriptで記述することが可能になりました。 execjs文使用すると外部のjsファイルも実行できます。

JavaScript実行時には、HidemaruGlobalオブジェクト、Hidemaruオブジェクト が常にグローバルに存在します。秀丸マクロ命令の実行や秀丸エディタの機能を使うには、この2つのオブジェクトを利用します。

  • HidemaruGlobalオブジェクトは、秀丸マクロの文/キーワード/関数と同名のメソッドがあります。 jsmode文により、グローバル展開をON/OFFできる。
  • Hidemaruオブジェクトは、秀丸エディタ本体関連機能がメソッドとして呼び出せます。 JavaScript と 秀丸マクロ 間で変数をやり取りする場合は、Hidemaruオブジェクトを使います。

他にも使用できるオブジェクトがあるのでマクロヘルプの JavaScript対応オブジェクト を参照してください。

その他 に注意点などが書いてあるので、よく読みましょう。

JavaScriptでなにができるのか

JavaScript は汎用プログラム言語です。各種ライブラリも利用できます。

JavaScriptの使い方としては以下の方法があります。どちらの方法がいいかはマクロによるのでいろいろ試してみましょう。

JavaScript実行環境

JavaScriptの実行環境としては以下の3つを指定可能です。

jsmode文のパラメータ1で文字列として指定します。

  • JScript(デフォルト)

    WSHベースのエンジンで秀丸エディタを実行できる環境なら標準搭載されています。

    対応規格は古い(ECMA-262 3rd edition(December 1999))。

    JScriptの資料はJScript and VBScript Microsoft Learnを参照。

  • Chakra

    IEベースのエンジン。

    対応規格は古い(ECMA-262 5.1 edition(December 2009))。

  • WebView2

    Chromium版 Microsoft Edge相当。 Windows10、11以外の場合は、MicrosoftのサイトからWebView2ランタイムをインストールする必要があります。 (Windows 7、8、8.1 をサポートしているのは、WebView2ランタイム バージョン 109 が最終になります)

    JavaScriptの資料はJavaScript MDNを参照。

新しい JavaScript を使いたい場合は「WebView2」を使うしかありませんが、実行環境としては Windows 10、11 が主なターゲットになります。どの Windows 環境でも動かそうとする場合、現状では「JScript」を使うことになります。

JavaScriptから秀丸マクロの文/キーワード/関数の呼び出し方法

秀丸マクロの文/キーワード/関数は、HidemaruGlobalオブジェクトのメソッドとして呼び出すことができます。

  • 一部例外はあるが 文/キーワード/関数 をそのままのメソッドとして使用できる。
    詳細は HidemaruGlobalオブジェクトのメソッドを参照。
  • メソッドとして呼び出す為、全て関数の書き方(メソッドの書き方)になる。(要は括弧を付けて呼び出す)
マクロの例
//filename2キーワードとmessage文の呼び出し
js {
    //HidemaruGlobalオブジェクト の名前は「hidemaruGlobal」
    a = hidemaruGlobal.filename2();
    hidemaruGlobal.message(a);
}

「hidemaruGlobal」のメソッドとして呼び出す為、hidemaruGlobal.filename2(); としていますが、「hidemaruGlobal.」は省略できます。 (通常はHidemaruGlobalのメソッドがグローバルに展開されている)

//filename2キーワードとmessage文の呼び出し
js {
    //HidemaruGlobalオブジェクトを省略
    a = filename2();
    message(a);
}

jsmode文を使うことで、明示的にグローバル展開を無効にしたり有効にしたりできます。

制限事項

秀丸エディタの切り替え

js{ }の実行中は、他の秀丸エディタへの切り替えができません。

従来のマクロでは、アクティブな秀丸ディタが切り替われば、マクロ実行する秀丸ディタも切り替わっていましたが、 js{ }内では切り替わりません。

  • 従来のマクロ

    debuginfo 1;
    openfile "a.txt";
    debuginfo sprintf("basename=%s\n",basename);
    openfile "b.txt";
    debuginfo sprintf("basename=%s\n",basename);
    endmacro;

    実行結果

    basename=a.txt
    basename=b.txt

    ファイルを開くと、アクティブな秀丸ディタも切り替わるので、マクロの実行も切り替わっている。 (basename が切り替わっている)

  • jsの場合

    debuginfo 1;
    openfile "a.txt";
    debuginfo sprintf("js:basename=%s\n",basename);
    js{
        openfile("b.txt");
        debuginfo(sprintf("js:basename=%s\n", basename()));
    }
    endmacro;

    実行結果

    js:basename=a.txt
    js:basename=a.txt

    ファイルを開くと、アクティブな秀丸ディタは切り替わるが、マクロの実行は切り替わっていない。 (basename が変わっていない)

数値のやり取り

数値を JavaScript と 秀丸マクロ 間でやり取りする場合は、64bit版でも、32bitまでという制限あり。

(hidemaruオブジェクトの)getVar/setVarによる JavaScript - 秀丸マクロ間の数値型変数とのやりとりは、32bitの数値として扱われる。

32bitの数値の上限は 2147483647、下限は -2147483648
  • サンプルマクロ

    debuginfo 2;
    #a = 0x123456789;
    debuginfo(sprintf("macro:#a=0x%llx\n", #a));
    js{
        var jsval1 = hidemaru.getVar("#a");
        hidemaruGlobal.debuginfo(hidemaruGlobal.sprintf("js{} :#a=0x%llx\n", jsval1));
        var jsval2 = 0x123456789;
        hidemaruGlobal.debuginfo(hidemaruGlobal.sprintf("js{} :#b=0x%llx\n", jsval2));
        hidemaru.setVar("#b", jsval2);
    }
    debuginfo(sprintf("macro:#b=0x%llx\n", #b));
    endmacro;
  • 実行結果

    macro:#a=0x123456789
    js{} :#a=0x23456789
    js{} :#b=0x123456789
    macro:#b=0x0
    • 32bit 以上の値を 秀丸マクロ → JavaScript の場合は、32bit で切り捨てられた値が JavaScript へ送られる。
    • 32bit 以上の値を JavaScript → 秀丸マクロ の場合は、0 が 秀丸マクロ へ送られる。

ページトップ 目次に戻る