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

概要

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

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

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

$ret = sprintf(....);

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

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

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

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

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

引数が書き換わる関数

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

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

  • PowerShell側のソース

    コード
    $dummyColumn = 0;
    # 改行制御記号は、PowerShellだと「`n」なので注意。ついつい\nと記述を誤りやすい。
    $ret = $hm::Macro::Function("getlinecount","ABCD`nXYZ", 7,$dummyColumn);
    if ($ret.Error -eq $null)
    {
        $lineno = $ret.Result;
        $column = $ret.Args[2];
    # 関数に渡した引数が、関数の実行後どうなったのかList<Object>の形で格納されている。
    # 引数の3番目 dummyColumn に対応する引数Argsの3番目 (=0オジリンで2) に対応するマクロ変数の書き換えられた値が格納されてい。
    }
    

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

    • Resultプロパティ

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

    • Argsプロパティ

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

    • Errorプロパティ

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

    • Messageプロパティ

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