この機能を利用する場合、秀丸エディタ v8.98 (正式版 or β9以上)を強く推奨します。
そうでない場合、数値と文字列の型を間違えて実行すると秀丸が不正な状態となります。
Hm.Macro.Eval(...)を「関数向けに特化」したものとして、「Hm.Macro.Function」が用意されています。
秀丸マクロにおいて「関数」とは
$ret = sprintf(....);
のように呼び出しに「( )」を利用し、返り値を受け取る形になっているものです。
一方、類似ですが関数のようでいて「返り値」がなく、「( )」もないものは秀丸マクロでは「文」もしくは「命令文」としています。
マクロ実行中のみ実行可能
Hm.Macro.Function("秀丸マクロの関数名", ...引数);
C#の型に対する支援を期待するのなら、そのままHm.Macro.Function...と利用するよりも、
ラップするのがおすすめです。
また、秀丸マクロの関数にはごく一部、返り値のみならず、引数に渡している変数自体に値が入ってくるものもあります。
例えばgetlinecount (秀丸v8.94以降)やenumregvalue (秀丸v9.00以降)などが該当します。
こういったものも取得できるようになっています。
今回は「秀丸マクロ関数のgetlinecount」をラップしてみましょう。
実行した秀丸マク関数の返り値がObject型で入っています。
取得するには(string)もしくは(dynamic)にキャストした後、(int)や(long)でのキャストが必要です。
秀丸マク関数を実行した後、秀丸マクロ関数に渡した引数が最終的にどういった値になったかを取得できます。
List<Object>型で、関数に渡した最初の引数が[0], 次の引数が[1], ... といった形で格納されています。
各種リスト要素はObject型になっていますので、取得するには(string)もしくは(dynamic)にキャストした後、(int)や(long)でのキャストが必要です。
何か明確な例外が発生した場合はErrorプロパティにException型の例外インスタンスが入っています。
基本的には特になにもはいっておらず、空文字が入っています。
秀丸マクロの関数にはCOMなどで利用する「member関数」や、
秀丸の設定値を取得する「getconfig関数」など、
ごく一部「関数だけではその返り値が数値なのか文字列なのか区別が付かないものがあります。
Hm.Macro.Functionだけだと、そのような「関数の返り値の型が数値なのか文字列なのかが不定」なものを実行した場合、返り値が正しい状態にならないことがあります。
そこで、「Hm.Macro.Function<String>」やHm.Macro.Function<int>などを利用して、
返り値の型のヒントを秀丸マクロに与えつつ実行することが出来るようになっています。
Hm.Macro.Function<T>("秀丸マクロの関数名", ...引数);