窓使いの憂鬱で状態遷移を行う

別件で Visual Studio の editor を vi ぽくする mayu 用設定 file ( http://craftluna.org/vcvi-mayu/ ) を見つけてしまったので mode 切り替えもできるのかなーとか期待しつつ読みはじめたんだけど lock-key と &Toggle() 関数を使うことで状態を制御しているらしい。具体的には以下のような感じで。前提として lock-key0 が off のとき state01 、 on のとき state02 ということにしておこう。まずはある key を押すと状態が toggle するようにする場合。

# state 切り替えを楽にするためあらかじめ keyseq で定義しておく。
# HelpMessage() も同時に定義することで state 切り替えがわかりやすくなる。
keyseq $toggle-state = &Toggle(Lock0) &HelpMessage(, "state toggled")

# テケトーな例
window SomeApp /someapp\.exe/ : Global

# state01 のときの設定は "~L0-" という prefix をつけて定義する。
# "~L0-" は lock-key0 が off だよ、という意味の modifire
key ~L0-n = n a m e

# state02 のときの設定は "L0-" という prefix をつけて定義する。
# "L0-" は lock-key0 が on だよ、という意味の modifire
key  L0-n = n e x t


# 実際に状態遷移を行う key の定義。
# "t" を押すと状態が toggle する。
key t = $toggle-state

上記の設定は someapp.exe を起動したときに最初 state01 ではじまる。このとき "n" を押すと "name" が入力される。で、 "t" を押すと state02 へ toggle 。このときの "n" は "next" の入力になる。 state01 へ戻るには再び "t" を押せばいい、と。

次はある状態へ遷移するための key をわけたい場合。

# 同様に切り替え用 keyseq を定義。
# &Toggle() 関数の第 2 引数に "on" / "off" を指定するとその状態に固定するという意味になるらしい。
keyseq $change-to-state01 = &Toggle(Lock0, off) &HelpMessage(, "state01")
keyseq $change-to-state02 = &Toggle(Lock0, on)  &HelpMessage(, "state02")

# またテケトーな例
window AnotherApp /anotherapp\.exe/ : Global

# ここらへんは一緒。
key ~L0-n = n a m e # state01 の場合
key  L0-n = n e x t # state02 の場合

# 実際に状態遷移を行う key の定義。
# keyboard 上部の "1" を押すと state01 に、 "2" を押すと state02 になる。
# prefix は連続で切り替えがおこらないように遷移のおこる条件を限定している。
key L0-_1  = $change-to-state01    # state02 で "1" を押したとき
key ~L0-_2 = $change-to-state02    # state01 で "2" を押したとき

上記の場合は anotherapp.exe を起動したときに最初 state01 ではじまる。このとき "n" を押すと "name" が入力される。で、 "2" を押すと state02 へ遷移。このときの "n" は "next" の入力になる。 state01 へ戻るには "1" を押せばいい、と。 vcvi.mayu に書いてあったのはこっちの方で、これ見たときほぇーと思ってしまった。 Craftluna 氏まじ thx 。