KarabinerのVi Mode カーソル移動（Ctrl+hjkl）をSierraでも再現する


# 2017/03/12 更新
当初載せてあったluaのコードだとキーリピートが効かないとのことだったので修正しました。
その他諸々変更していたので、2017/03/12現在の設定に書き換えました。

# 概要

KarabinerがSierraに対応していないのでアップデートせずにいたのですが、新型Macbook ProでSierraが強制されるのもあり、対応せざるを得なくなりました。

元々Karabinerに設定していたのはこれぐらい。

![Kobito.4MsxrA.png](https://qiita-image-store.s3.amazonaws.com/0/1872/bb30b250-0c51-da60-3072-ad7f1e161ce5.png "Kobito.4MsxrA.png")

ほとんどErgodoxの為に設定していたもので、`For Japanese`の設定はErgodox側で対応出来、問題はVi Modeのカーソル移動だけ。

そこで[[KeyMove] Control_L+hjkl to Left/Down/Up/Right · Issue #103 · tekezo/Karabiner-Elements](https://github.com/tekezo/Karabiner-Elements/issues/103#issuecomment-250225961)を参考に[Hammerspoon](http://www.hammerspoon.org/)を使って実現することにした。

# 手順

https://github.com/Hammerspoon/hammerspoon/releases/latest からzipをダウンロード、解凍してAppを/Applications配下に設置。
もしくは、`brew cask install hammerspoon`でも可。私はこちらを使いました。

起動すると設定画面が表示されるので、`Launch Hammerspoon at login`をオンにする。
**Ctrl+hjklでカーソル移動させるだけならアクセシビリティの設定は不要**
コンソールが出るがこれは無視してOK

![Kobito.SmbGQH.png](https://qiita-image-store.s3.amazonaws.com/0/1872/38573e0a-f487-9b9b-5016-80651e773266.png "Kobito.SmbGQH.png")


次にメニューバーの`Open Config`を選択。

![Kobito.AlESJx.png](https://qiita-image-store.s3.amazonaws.com/0/1872/f3797a30-4ddd-7cd1-c139-537585b8aac7.png "Kobito.AlESJx.png")

エディタが開くので、以下をコピペ。保存。

```inti.lua
local function keyCode(key, modifiers)
   modifiers = modifiers or {}
   return function()
      hs.eventtap.event.newKeyEvent(modifiers, string.lower(key), true):post()
      hs.timer.usleep(1000)
      hs.eventtap.event.newKeyEvent(modifiers, string.lower(key), false):post()
   end
end

local function remapKey(modifiers, key, keyCode)
   hs.hotkey.bind(modifiers, key, keyCode, nil, keyCode)
end

remapKey({'ctrl'}, 'h', keyCode('left'))
remapKey({'ctrl'}, 'j', keyCode('down'))
remapKey({'ctrl'}, 'k', keyCode('up'))
remapKey({'ctrl'}, 'l', keyCode('right'))

remapKey({'ctrl', 'shift'}, 'h', keyCode('left', {'shift'}))
remapKey({'ctrl', 'shift'}, 'j', keyCode('down', {'shift'}))
remapKey({'ctrl', 'shift'}, 'k', keyCode('up', {'shift'}))
remapKey({'ctrl', 'shift'}, 'l', keyCode('right', {'shift'}))

remapKey({'ctrl', 'cmd'}, 'h', keyCode('left', {'cmd'}))
remapKey({'ctrl', 'cmd'}, 'j', keyCode('down', {'cmd'}))
remapKey({'ctrl', 'cmd'}, 'k', keyCode('up', {'cmd'}))
remapKey({'ctrl', 'cmd'}, 'l', keyCode('right', {'cmd'}))

remapKey({'ctrl', 'shift', 'cmd'}, 'h', keyCode('left', {'shift', 'cmd'}))
remapKey({'ctrl', 'shift', 'cmd'}, 'j', keyCode('down', {'shift', 'cmd'}))
remapKey({'ctrl', 'shift', 'cmd'}, 'k', keyCode('up', {'shift', 'cmd'}))
remapKey({'ctrl', 'shift', 'cmd'}, 'l', keyCode('right', {'shift', 'cmd'}))

remapKey({'ctrl', 'alt'}, 'h', keyCode('left', {'alt'}))
remapKey({'ctrl', 'alt'}, 'j', keyCode('down', {'alt'}))
remapKey({'ctrl', 'alt'}, 'k', keyCode('up', {'alt'}))
remapKey({'ctrl', 'alt'}, 'l', keyCode('right', {'alt'}))

remapKey({'ctrl', 'shift', 'alt'}, 'h', keyCode('left', {'shift', 'alt'}))
remapKey({'ctrl', 'shift', 'alt'}, 'j', keyCode('down', {'shift', 'alt'}))
remapKey({'ctrl', 'shift', 'alt'}, 'k', keyCode('up', {'shift', 'alt'}))
remapKey({'ctrl', 'shift', 'alt'}, 'l', keyCode('right', {'shift', 'alt'}))

remapKey({'ctrl', 'cmd', 'alt'}, 'h', keyCode('left', {'cmd', 'alt'}))
remapKey({'ctrl', 'cmd', 'alt'}, 'j', keyCode('down', {'cmd', 'alt'}))
remapKey({'ctrl', 'cmd', 'alt'}, 'k', keyCode('up', {'cmd', 'alt'}))
remapKey({'ctrl', 'cmd', 'alt'}, 'l', keyCode('right', {'cmd', 'alt'}))
```

保存後にメニューバーの`Reload Config`で反映される。

参考にしたコードだけだと単純なカーソル移動しかできず、テキストの選択や先頭への移動などが出来なかったので追加分で対応してます。


# まとめ

最初は[macOS Sierra でもKalabinerのvi modeでカーソル移動したい【Ctrl + h/j/k/l】 - Qiita](http://qiita.com/unasaka/items/bb9e41f854665fa1a61e)を参考に設定しようかとも思ったんですが、有料だったりもしたのでこちらの方法を使いました。

今回はCtrl+hjklでカーソル移動出来るようにしましたが、hjklの部分を好みに合わせて変更できるのでKarabinerが対応するまでの繋ぎとして使えそうでオススメです。