AutoHotkeyで短い連続入力を認識させる方法
WindowsでどこでもVimをエミュレート出来るようにする vim_ahkでもらったPull Requestで教えてもらった方法です。
jj instead of Esc by satsaeid · Pull Request #12 · rcmdnk/vim_ahk
以下の様な設定を読み込むとJJと素早く
二回入力した時にjj!
というメッセージが出ます。
~j up::
Input, jout, I T0.1 V L1, {j}
if(ErrorLevel == "EndKey:J"){
SendInput, {BackSpace 2}
MsgBox, jj!
}
Return
マップするキーは~j up
となってますが、
このup
は指定のキーを放した時に動作する、という設定になります。
この場合はJを放した時、になりますが、この設定は
Jを押す動作も乗っ取るので
j up
という設定だとJを押したタイミングでは何もしなくなります。
今回はJが一度きりだったり直後にJが来なければそのままj
を入力したいので、
~
を使って取り敢えずj
をそのまま入力するようにしています。
その後、一度Jを放した後に行われる動作の中で
Input
と言う機能を使っています。
Input [, OutputVar, Options, EndKeys, MatchList]
Input
が実行されるとキー入力が
OutputVar
に入る様になります。
上の場合はjout
という変数に入れてますがここでは特に使ってません。
ここでのOptions
は
- I: AutoHotkeyによって作られた信号は無視する。
- Tn: n秒だけ入力を待つ。少数可。ここでは0.1秒でタイムアウト。
- V: 入力を隠さずアプリケーションに送る。
- Ln: n文字が入力上限数。ここでは一文字のみ。
EndKeys
はこの文字が入力されたらInput
を終了するキー。
ここではj
の一文字だけ待つだけなのでj
を。
ここでEndKeys
に該当する文字が打ち込まれると、
ErrorLevel
がEndKey:J
の様に該当のEndKeyになります。
最後のMatchList
は入力された文字列にマッチするかどうか調べるための引数で、
入力文字列がこれにマッチするとErrorLevel
がMatch
になります。
ここでは一文字だけ入れるだけでEndKeys
で合えばそれで良いので
なにも与えていません。
Options
でV
を指定しているので、入力した文字は取り敢えずはそのまま出力されます。
その後、もしJだった場合、~j up
でトリガーとして使ったj
と
Input
で入力されたj
の2つを削除(BackSpace
2回)してその後やりたいことをやっています。
もしJ以外が押されたり、0.1秒以上何も押されなければ入力されたままになります。