秀丸マクロを「関数」を文字列で実行

概要

この機能を利用する場合、秀丸エディタ v8.98 (正式版 or β9以上)を強く推奨します。
そうでない場合、数値と文字列の型を間違えて実行すると秀丸が不正な状態となります。

$hm.Macro.Eval(...)を「関数向けに特化」したものとして、「$hm.Macro.Function」が用意されています。

秀丸マクロにおいて「関数」とは

$ret = sprintf(....);

のように呼び出しに「( )」を利用し、返り値を受け取る形になっているものです。

一方、類似ですが関数のようでいて「返り値」がなく、「( )」もないものは秀丸マクロでは「文」もしくは「命令文」としています。

秀丸マクロの関数を実行可能です。

$hm.Macro.Function("秀丸マクロの関数名", ...引数);
  • Ruby側のソース

    コード
    ret = $hm.Macro.Function("sprintf", "%03d", 555); # 秀丸マクロ関数の「sprintf」を呼び出してみる例。
    if (ret.Error == nil) then
        retValue = ret.Result; # Result には「関数(今回の場合sprintf)の返り値」が入っている。
        updatedArgs = ret.Args; # Argsには引数("%03d", 555)の関数実行後の値がList<Object>の形で格納されている。
                                    # この機能は秀丸マクロの「getlinecount」など引数の値自体を書き換える関数のためにある。
    else
        hm.OutputPane.Output("実行失敗\r\n");
    end
    

引数が書き換わる関数

秀丸マクロの関数にはごく一部、返り値のみならず、引数に渡した変数自体に値が入ってくるものもあります。
例えばgetlinecount (秀丸v8.94以降)enumregvalue (秀丸v9.00以降)などが該当します。
こういったものも取得できるようになっています。

今回は「秀丸マクロ関数のgetlinecount」を実行してみましょう。

  • Ruby側のソース

    コード
    ret = $hm.Macro.Function("getlinecount", "ABCD\nXYZ", 7, dummyColumn);
    if (ret.Error == nil) then
        lineno = ret.Result;
        column = ret.Args[2]; # 関数に渡した引数が、関数の実行後どうなったのかList<Object>の形で格納されている。
                                # 引数の3番目 dummyColumn に対応する引数Argsの3番目 (=0オジリンで2) に対応するマクロ変数の書き換えられた値が格納されてい。
    end
    

$hm.Macro.Function(...) の返り値

    • Resultプロパティ

      実行した秀丸マク関数の返り値がObject型で入っています。

    • Argsプロパティ

      秀丸マク関数を実行した後、秀丸マクロ関数に渡した引数が最終的にどういった値になったかを取得できます。
      List<Object>型で、関数に渡した最初の引数が[0], 次の引数が[1], ... といった形で格納されています。

    • Errorプロパティ

      何か明確な例外が発生した場合はErrorプロパティにException型の例外インスタンスが入っています。
      エラーがなければnullが入っています。

    • Messageプロパティ

      基本的には特になにもはいっておらず、空文字が入っています。