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

概要

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

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

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

$ret = sprintf(....);

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

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

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

$Hm->Macro->doFunction->秀丸マクロの関数名(...引数);
  • PHP側のソース

    コード
    list($retult, $args, $error, $message) = $Hm->Macro->doFunction->sprintf("%03d", 555); // 秀丸マクロ関数の「sprintf」を呼び出してみる例。
    if ($error == null)
    {
        $retValue = $result; // $result には「関数(今回の場合sprintf)の返り値」が入っている。
        $updatedArgs = $args; // $argsには引数("%03d", 555)の関数実行後の値が配列の形で格納されている。
                                    // この機能は秀丸マクロの「getlinecount」など引数の値自体を書き換える関数のためにある。
    }
    else
    {
        $Hm->OutputPane->Output("実行失敗\r\n");
    }
    

引数が書き換わる関数

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

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

  • PHP側のソース

    コード
    $dummyColumn = 0;
    list($result, $args, $error, $message) = $Hm->Macro->doFunction->getlinecount("ABCD\nXYZ", 7, $dummyColumn);
    if ($error == null)
    {
        $lineno = $result;  // 64bit⇒32bitなどでキャストエラーを起こさないようにdynamicを間にはさむ
        $column = $args[2]; // 関数に渡した引数が、関数の実行後どうなったのか配列の形で格納されている。
                                // 引数の3番目 dummyColumn に対応する引数$argsの3番目 (=0オジリンで2) に対応するマクロ変数の書き換えられた値が格納されてい。
    }
    

$Hm->Macro->doFunction(...) の返り値

    • result(1番目)

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

    • args(2番目)

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

    • error(3番目)

      何か明確な例外が発生した場合は例外(RuntimeException)が入っています。
      エラーがなければnullが入っています。

    • message(4番目)

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