秀丸マクロを改めて実行(文字列編)

概要

秀丸マクロが実行されていない時、秀丸マクロを改めて実行する」ことが出来ます。

マクロを実行していない時にのみ、実行可能なため、
ほとんどのシチュエーションでは「async await Task.Run Thread Timer」といったものをキーワードとする
「非同期のメソッド」にて使うこととなるでしょう。

文字列を記述して直接実行することもできますし、
ファイルを指定して実行することもできます。

ここでは、文字列で実行する方法を示します。

秀丸マクロファイルを改めて実行

マクロを実行していない時にのみ、実行することが出来ます。

Hm.Macro.Exec.Eval("マクロ命令群の文字列")
  • C#側のソース

    MyTestForm.cs
    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using HmNetCOM;
    
    namespace NET4COMServer
    {
        [Guid("986F16AF-42EC-4F33-9F94-0ACA08EA0A87")]
        public class NET4COMServer
        {
            // 確認しやすいようコンソール表示のため
            [DllImport("kernel32.dll")]
            private static extern bool AllocConsole();
    
            // 静的コンストラクタ(static付きコンストラクタ)でコンソール表示を読んでおけば良い。
            static NET4COMServer()
            {
                AllocConsole();
            }
    
            // 非同期のメソッド
            static string HeavyMethod()
            {
                Thread.Sleep(2000);
    
                // このdllがあるディレクトリ
                string asmLocation = System.Reflection.Assembly.GetExecutingAssembly().Location;
                string dir = System.IO.Path.GetDirectoryName(asmLocation);
    
                // マクロを実行していない時
                if (!Hm.Macro.IsExecuting)
                {
                    // 「あいうえお」という文字列を編集中のテキストに挿入。
                    var result = Hm.Macro.Exec.Eval(@"
                        $test_mes = ""あいうえお"";
                        insert $test_mes;
    
                        endmacro ""最後まで実行出来た"";
                    ");
    
                    if (result.Message == "最後まで実行出来た")
                    {
                        Console.WriteLine("実行成功");
                    }
                    else
                    {
                        Console.WriteLine("実行失敗");
                    }
                }
                System.Diagnostics.Trace.WriteLine("非同期関数");
    
                return "非同期関数";
            }  
    
            // 秀丸から呼び出すCOMのメソッド。COM呼び出しだとstaticを付けては駄目。
            public string CalledFuncFromHidemaruMacro()
            {
                Task<string> task = Task.Run(() => {
                    return HeavyMethod();
                });
    
                // awaitやTaskのResult待ちしないので、この関数自体は一瞬で抜けていく。
                return "同期関数";
            }
        }
    }
    
    • endmacro の後ろの文字列

      「秀丸マクロ内の endmacro の後ろの文字列 が肝となります。

    • Messageプロパティ

      endmacroまで実行できたならば、Messageプロパティにその値が入っていることでしょう。

    • Errorプロパティ

      何か明確な例外が発生した場合はErrorプロパティに例外を捕捉出来ることもありますが、
      情報としての確実性に欠けます。
      原則的には、「endmacroの後ろの文字列」でどこまで実行できたのかを、把握するのが適切です。

    • Resultプロパティ

      実行の状態によって返ってくる値が異なります、参考程度の値であり、あまりこの値に基づいたプログラムを記述するべきではありません。