getarg関数とexecmacro文No.08348
h-tom さん 14/08/25 22:36
 

h-tom です。

秀丸エディタ Ver.8.41β4

getarg関数を、execmacroの引数に使うと、ちょっと予想外の動作になりました。
test1.mac で getarg(0) の内容を変数に入れ、それを execmacro の引数に指定する
と、
期待した結果になります。

getarg関数を、execmacroの引数に使う事はできないでしょうか?
(内容が同じって事は、内容をセットしながら呼び出している状態?)

やりたいのは、引数付きでマクロを起動した場合、そのマクロから起動するマクロに、
そのまま引数を渡すという事なんですが、引数を変数に格納しないと駄目ですかね?

//サンプルマクロ
ファイル名:test.mac
00001|execmacro "test1.mac", "1st";
00002|endmacro;

ファイル名:test1.mac
00001|execmacro "test2.mac", "2nd", getarg(0);
00002|endmacro;

ファイル名:test2.mac
00001|message "getarg(0):" + getarg(0) + "\ngetarg(1):" + getarg(1);
00002|endmacro;

マクロの実行結果
---------------------------
秀丸エディタ
---------------------------
getarg(0):2nd
getarg(1):2nd  <-- 1st になると思ったら2nd
---------------------------
OK  
---------------------------

[ ]
RE:08348 getarg関数とexecmacro文No.08349
秀丸担当 さん 14/08/26 09:45
 

確かにそうなることが確認できました。
マクロヘルプのgetargのところにも一応書かれているのですが、execmacroで呼
んだマクロの中でさらにexecmacroする場合、getargは元の状態を覚えていない
ので、変数に退避する必要があります。
execmacro文を呼ぶ時点で、それまでのgetargで取得できるものは全て消去され、
新しいものに入れ替わります。
ただexecmacro文の引数としてgetargを使う場合は、getargの消去かgetargの取
得かのどちらを先に処理しているかの問題で、今は消去を先にしてしまっている
のでそうなっていました。
取得を先にすることも難しくは無いので、そのように修正させていただきます。

[ ]
RE:08349 getarg関数とexecmacro文No.08350
h-tom さん 14/08/26 23:38
 

h-tom です。

>ただexecmacro文の引数としてgetargを使う場合は、getargの消去かgetargの取
>得かのどちらを先に処理しているかの問題で、今は消去を先にしてしまっている
>のでそうなっていました。
>取得を先にすることも難しくは無いので、そのように修正させていただきます。
お手数ですが、よろしくお願いします。

あと、調査でかなり変な事をやったのが原因なんですが、クラッシュする場合が
ありました。
「getargで取得する位置がなんかズレている?」と思い込んで、結果的に、

  execmacro "test1.mac", "1st", getarg(-1);
 
という状態のマクロを実行したら、秀丸エディタがクラッシュしました。
変更ついでに直るかもしれませんが、連絡しておきます。

[ ]
RE:08350 getarg関数とexecmacro文No.08351
秀丸担当 さん 14/08/27 09:29
 

確かにその通りでした。
こちらも一緒に修正させていただきます。
V8.41の次のβ版で修正します。

[ ]