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

概要

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

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

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

moveto X座標, Y座標

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

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

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

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

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

    MyTestForm.cs
    using System;
    using System.Windows.Forms;
    using Hidemaru;
    
    namespace HmTest
    {
    partial class HmTestForm
    {
        protected void MethodCreate()
        {
            System.Diagnostics.Trace.WriteLine("フォーム生成時");
    
            var ret = Hm.Macro.Statement("moveto", 10, 2); // X:10, Y:2 の位置に移動
            if (ret.Error == null ) // ret.Result > 0 という判定でも同一の意味
            {
                Hm.OutputPane.Output("実行成功\r\n");
            }
            else
            {
                Hm.OutputPane.Output("実行失敗\r\n");
            }
        }
        protected void MethodTick()
        {
            System.Diagnostics.Trace.WriteLine("チック時");
        }
        protected void MethodDestroy()
        {
            System.Diagnostics.Trace.WriteLine("フォームクローズ時");
        }
    }
    
    }
    
    
  • 秀丸マクロ側のソース

    前章の「HmNETTest.mac」と同一です。

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

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

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

  • C#側のソース

    MyTestForm.cs
    using System;
    using System.Windows.Forms;
    using Hidemaru;
    
    namespace HmTest
    {
    partial class HmTestForm
    {
        protected void MethodCreate()
        {
            System.Diagnostics.Trace.WriteLine("フォーム生成時");
    
                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("エラー");
                }
        }
        protected void MethodTick()
        {
            System.Diagnostics.Trace.WriteLine("チック時");
        }
        protected void MethodDestroy()
        {
            System.Diagnostics.Trace.WriteLine("フォームクローズ時");
        }
    }
    
    }
    
    

秀丸マクロ側のソース

前章の「HmNETTest.mac」と同一です。

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

  • Resultプロパティ

    実行した秀丸マクロ文が無事成功したなら「1」失敗したなら「0」がint型で入っています。

  • Argsプロパティ

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

  • Errorプロパティ

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

  • Messageプロパティ

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