rcmdnk's blog

20130723_AutoHotKey_200_200

Windows上でAutoHotkeyを使ってどこでもVimを実現するvim_ahkjk/sdの同時押しでNormalモードに入るキーを追加しました。

vim_ahk

EvernoteとかWindows上のエディタ上でものを書く時にVimの様な動作を実現するための AutoHotkeyのスクリプトです。

上のレポジトリにvim_ahk.exeという実行ファイルもあるので AutoHotkeyがなくても動きます。

メモ帳などを開いて、ESCを押すとNormalに入ってH/J/K/Lで移動できたり DDでライン削除出来たりPでペーストできたり基本的な Vim動作が出来る様になります。

jk/sdの同時押し

これまでJJと連続で押すとNormalモードに入る設定はありましたが、 これに加えJKSDの同時押しでもNormalモードに入れる様にしました。

デフォルトではオフになっているので、 設定画面から

  • JK to enter Normal mode
  • SD to enter Normal mode

にチェックを入れるとそれぞれ有効になります。

実装の話

実際のところJJよりも JKとかの方が実装は簡単です。

こんな感じになっています。

vim.ahk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#If WinActive("ahk_group " . VimGroupName) and (InStr(VimMode, "Insert")) and (VimJJ == 1)
~j up:: ; jj: go to Normal mode.
  Input, jout, I T0.1 V L1, j
  if(ErrorLevel == "EndKey:J"){
    SendInput, {BackSpace 2}
    VimSetNormal()
  }
Return
; }}}

#If WinActive("ahk_group " . VimGroupName) and (InStr(VimMode, "Insert")) and (VimJK == 1)
j & k::
k & j::
  SendInput, {BackSpace 1}
  VimSetNormal()
Return
; }}}

#If WinActive("ahk_group " . VimGroupName) and (InStr(VimMode, "Insert")) and (VimSD == 1)
s & d::
d & s::
  SendInput, {BackSpace 1}
  VimSetNormal()
Return
; }}}

If文のところは有効にするアプリとInsertモードであるという状態(つまりは通常のOSの入力状態)、加えて それぞれのオプションが有効化どうかをチェックしています。

JJについては ~j upという、Jを離したとき、に関する設定です。 T0.1という部分で0.1秒以内に次の入力があったら、という設定になっています。

J以外が来るか0.1秒以上たったら通常の振る舞いになります。

ただ、いずれにしろ押した瞬間にJは送られるので一瞬表示され、 さらにJがすぐに押されても入力は行われてしまいます。

そこで{BackSpace 2}で二文字消してるわけです。

詳しくは以下参照。

JKSDの方は簡単で 2つ同時押しに対しては&を使って2つ繋げてあげれば良いだけ。

ただ、この場合は最初に押された方のキーが送られてしまうのでその一文字を消しています。 また、どちらが先に押されても良いように両方の順でそれぞれ書いています。

Mac版

MacでもKarabiner-Elementsを使って同じ様なことが出来ます。

Karabiner-Elements complex_modifications rules by rcmdnk からVim emulationをImportしてください。

もともとこっちにJKSD でのNormalとInsertのトグルセットがあったので AutoHotkey版にも入れようと思ってたんですが 今回Issueが来たので入れてみました。

ちょっと注意が必要なのはMac版はNormalモードからもInsertモードに戻るトグル形式ですが、 Windows版だとInsertモードからNormalモードになるだけです。

もしトグル形式がほしいという人が居たらIssueとかに入れてくれればそのうちやります。(これはちょっと面倒、かも。)

逆にWindows版の方にしかないJJのMac版への移植は 多分最近また進化しているKarabiner-Elementsなら簡単に出来るんじゃないかと思うので そのうちやりたいと思います。

Sponsored Links
Sponsored Links

« GitのPagerの設定 シェルスクリプト関数でポインタ渡しもどきを実装する »

}