rcmdnk's blog

JJ(ジェイジェイ) 2017年 12 月号 [雑誌]

AutoHotkeyの中で素早く2回キー入力した時に特殊な動作を割り当てたい時に 使える方法について

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は指定のキーを放した時に動作する、という設定になります。

Hotkeys (Mouse, Joystick and Keyboard Shortcuts)

この場合はJを放した時、になりますが、この設定は Jを押す動作も乗っ取るので j upという設定だとJを押したタイミングでは何もしなくなります。

今回はJが一度きりだったり直後にJが来なければそのままjを入力したいので、 ~を使って取り敢えずjをそのまま入力するようにしています。

その後、一度Jを放した後に行われる動作の中で Inputと言う機能を使っています。

Input [, OutputVar, Options, EndKeys, MatchList]

Input

Inputが実行されるとキー入力が OutputVarに入る様になります。

上の場合はjoutという変数に入れてますがここでは特に使ってません。

ここでのOptions

  • I: AutoHotkeyによって作られた信号は無視する。
  • Tn: n秒だけ入力を待つ。少数可。ここでは0.1秒でタイムアウト。
  • V: 入力を隠さずアプリケーションに送る。
  • Ln: n文字が入力上限数。ここでは一文字のみ。

EndKeysはこの文字が入力されたらInputを終了するキー。 ここではjの一文字だけ待つだけなのでjを。 ここでEndKeysに該当する文字が打ち込まれると、 ErrorLevelEndKey:Jの様に該当のEndKeyになります。

最後のMatchListは入力された文字列にマッチするかどうか調べるための引数で、 入力文字列がこれにマッチするとErrorLevelMatchになります。 ここでは一文字だけ入れるだけでEndKeysで合えばそれで良いので なにも与えていません。

OptionsVを指定しているので、入力した文字は取り敢えずはそのまま出力されます。

その後、もしJだった場合、~j upでトリガーとして使ったjInputで入力されたjの2つを削除(BackSpace2回)してその後やりたいことをやっています。

もしJ以外が押されたり、0.1秒以上何も押されなければ入力されたままになります。

Sponsored Links
Sponsored Links

« Vim Vixen: Vimperatorの代わりになるかもしれないアドオン AutoHotkeyでのメニューの追加 »

}