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つを削除(BackSpace2回)してその後やりたいことをやっています。
もしJ以外が押されたり、0.1秒以上何も押されなければ入力されたままになります。
![JJ(ジェイジェイ) 2017年 12 月号 [雑誌]](https://images-na.ssl-images-amazon.com/images/I/511pHA-FwVL._SS200_.jpg)