入門編 ~秀丸マクロの「(関数のような)命令文」を文字列で実行~

概要

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

Hm.Macro.Eval(...)を「命令向けに特化」したものとして、「Hm.Macro.Statement」が用意されています。

秀丸マクロにおいて「(関数のような)文」や「(関数のような)命令文」とは

moveto X座標, Y座標

のように呼び出しに「( )」が使われず、かつ、返り値を受け取らないものです。

一方、文と類似ですが「返り値」があり、「( )」を付けて呼び出すものを「関数」としています。

秀丸マクロの(関数のような)文を実行可能です。

マクロ実行中のみ実行可能

Hm.Macro.Statement("秀丸マクロの文名", ...引数);
  • C#側のソース

    MyTestForm.cs
    using System;
    using HmNetCOM;
    
    ...
        private void SomeMethod()
        {
            var ret = Hm.Macro.Statement("moveto", 10, 2); // X:10, Y:2 の位置に移動
            if (ret.Error == null )
            {
                Hm.OutputPane.Output("実行成功\r\n");
            }
            else
            {
                Hm.OutputPane.Output("実行失敗\r\n");
            }
        }
    

引数として「配列」を必要とする関数のような文

秀丸マクロの文や関数にはごく一部には「menuarray」など 引数として「配列」を必要とするものがあります。

今回は「秀丸マクロ文のmenuarray」を利用してみましょう。

  • C#側のソース

    MyTestForm.cs
    using System;
    using HmNetCOM;
    
    ...
        private void SomeMethod()
        {
                try
                {
                    var menulist = new List<String>()
                    {
                        "1ばんめ",
                        "2ばんめ",
                        "3ばんめ"
                    };
                    var ret = Hm.Macro.Statement("menuarray", menulist, menulist.Count);
                    var selectedId = (int)(dynamic)Hm.Macro.Var["result"];
                    Hm.OutputPane.Output($"{selectedId}\r\n");
                }
                catch (Exception e)
                {
                    Hm.OutputPane.Output("エラー");
                }
        }
    

Hm.Macro.Statement(...) 返り値

  • Resultプロパティ

    実行した秀丸マクロ文が無事成功したなら「秀丸マクロのresult相当の値が」、失敗したなら「0」以下がint型で入っています。
    0とは限らないので注意してください。
    ステートメントの実行そのものが成功したのかはResultプロパティではなくErrorプロパティで判定してください。
    getResult()では実行に成功した結果、マイナスのresult値が返ってきていることもあり得ます。

  • Argsプロパティ

    秀丸マク関数を実行した後、秀丸マクロ関数に渡した引数が最終的にどういった値になったかを取得できます。
    List<Object>型で、関数に渡した最初の引数が[0], 次の引数が[1], ... といった形で格納されています。 各種リスト要素はObject型になっていますので、取得するには(string)もしくは(dynamic)にキャストした後、(int)や(long)でのキャストが必要です。

  • Errorプロパティ

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

  • Messageプロパティ

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