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

  • 35
    いいね
  • 0
    コメント

2017/03/12 更新

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

概要

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

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

Kobito.4MsxrA.png

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

そこで[KeyMove] Control_L+hjkl to Left/Down/Up/Right · Issue #103 · tekezo/Karabiner-Elementsを参考にHammerspoonを使って実現することにした。

手順

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

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

Kobito.SmbGQH.png

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

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を参考に設定しようかとも思ったんですが、有料だったりもしたのでこちらの方法を使いました。

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