アプリ

MacBookでVimのカーソル移動をSierraでも実現できるHammerspoon

Mac OSをSierraにアップデートして一番困るのがKarabinerが使えないことでした。Vimのカーソル移動をブラウザとかでもできるようにする機能もその一つです。Karabinerを使わずHammerspoonというアプリを使ってVimのカーソル移動を実現する方法を調べたのでご紹介します。

Hammerspoon

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からダウンロードできます。

インストールが終わると、ApplicationsHammerspoon.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で使えないほうがもっと不便なので是非使ってみて下さい。

-アプリ