Mac OSをSierraにアップデートして一番困るのがKarabinerが使えないことでした。Vimのカーソル移動をブラウザとかでもできるようにする機能もその一つです。Karabinerを使わずHammerspoonというアプリを使ってVimのカーソル移動を実現する方法を調べたのでご紹介します。
Hammerspoonとは?
公式ホームページによると、
This is a tool for powerful automation of OS X. At its core, Hammerspoon is just a bridge between the operating system and a Lua scripting engine. What gives Hammerspoon its power is a set of extensions that expose specific pieces of system functionality, to the user.
http://www.hammerspoon.org
OSとLuaスクリプトの橋渡しをしてくれるアプリだそうです。どういうことかというと、OS Xを制御するAPIをLua言語で記述できる感じです。Hammerspoonを使ってキーリマップをLua言語で記述するとVimのようなカーソル移動を実現できるようになります。
Hammerspoonを使ってVimのカーソル移動をSierraで実現
brewを使うとカンタンにインストールできます
$ brew cask instal hammerspoon
brew使っていない方は、https://github.com/Hammerspoon/hammerspoo://github.com/Hammerspoon/hammerspoonからダウンロードできます。
インストールが終わると、Applications
にHammerspoon.app
があるので開くと、
こんな画面がでてきます。
個人的には、以下のように設定しました。
Open Config
をクリックすると、エディタが開くので以下をコピペして保存する
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
を押すと反映されます。
ブラウザとかFinderとかで、Ctrl + ijkl
で移動できるようになります。あー幸せです。
最後に
Karabinerだとチェックボックスを入れるだけで実現できたので、Hammerspoonの方がちょっと不便ですがSierraで使えないほうがもっと不便なので是非使ってみて下さい。