2024年9月12日木曜日

EVENTで*stopの代わりに*gotoを使う

EVENTで*stopを使うと、*linecustと相性が悪い場合があるので、代わりに*gotoを使う話です。

問題意識

FIRSTEVENTやLOADEVENTで、*ifmatchと*stopを使って条件分岐をすることは、よくあることだと思う。以下はPPC起動時に、IDが[A]ならhogeを、それ以外ならfugaをメッセージ表示する設定。

KC_main    = {    ; PPcメイン窓
FIRSTEVENT    ,*ifmatch CA,%n %: *linemessage hoge %: *stop
    *linemessage fuga
}

これだと、後で別の設定を*linecustで追加しようとした時、困ったことが起きる。例えば、PPC起動時にメッセージウインドウを表示しようとして、以下のコマンドを実行したとする。

*linecust homu,KC_main:FIRSTEVENT,%%I"hello world"

すると、FIRSTEVENTは以下のようになる。

KC_main    = {    ; PPcメイン窓
FIRSTEVENT    ,*ifmatch CA,%n %: *linemessage hoge %: *stop
    *linemessage fuga
    %mhomu %I"hello world"
}

これでは、想定した通りの動きにならない。起動したPPCのIDが[A]の時、一行目で処理が止まるからだ。手動で処理の順序をいじったりすれば解決するかもしれないが、そういうややこしいことはできればしたくない。

*stopの代わりに*gotoを使う

*stopの代わりに*gotoを使えば、この問題は解決しそうだ。

KC_main    = {    ; PPcメイン窓
FIRSTEVENT    ,*ifmatch CA,%n %: *linemessage hoge %: *goto Last
    *linemessage fuga
    %mLast
}

これなら、*linecustで追加した処理が無事実行されることになる。

KC_main    = {    ; PPcメイン窓
FIRSTEVENT    ,*ifmatch CA,%n %: *linemessage hoge %: *goto Last
    *linemessage fuga
    %mLast
    %mhomu %I"hello world"
}

*linecustが使いやすくなる分だけ、*stopよりも*gotoの方が少しお得。これがホントのgoto EVENTってやつですねw

:y=-( ゚д゚)・∵;; ターン

0 件のコメント:

コメントを投稿