SierraにおけるKarabiner対策

MacのOS X 10.12 Sierraになってから完全にKarabinerが使えなくなった。これはMacのキーボードオペレーションをカスタマイズするツールなのだが、かなり細かく設定出来るので愛用者は多い。そしてSierraで使えなくなってガッカリするポストもいろいろなSNSで見る。

しかし!私は、Karabinerを使って「shift+cmd+h, j, k, l」でカーソル移動を割り当てて居た。普通のエディターでもカーソル移動だけでも手をホームポジションから移動さえなくてもよくしていた。これが出来なくなったのはかなりイタイ。なんと言っても精神的ストレスがすごい。

などとTwitterにポストしたところ、はらぱんさん(@harada4atsushi)から「HammerSpoonがいいよ!」と教えてもらいました。

HammerSpoon

さっそく落としてみますが、もともとはLuaでスクリプトを書いてMacの挙動を操るツールみたいで途方に暮れます。Apple Scriptみたいな感じですかね。

で、ググって見るとQiitaに「HammerSPoonでKarabinerと同じことをさせるスクリプト」を公開している方がいたので、ありがたく頂いてキーバインドのところを改修して実現出来ました(私はググっただけですが)。

Karabiner使えない対策

この記事の方……「Ito Naoya」さんですけど……「伊藤直也」さんですよね? お二方、ありがとうございます。

最後のカーソル移動の定義のところは、この4つだけにしました。

※ 2017.05.11追記 ctrl+shift+cmd+↑、↓で、pageup、pagedownになるように追加しました。

-- カーソル移動
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

local function disableAllHotkeys()  
   for k, v in pairs(hs.hotkey.getHotkeys()) do
      v['_hk']:disable()
   end
end

local function enableAllHotkeys()  
   for k, v in pairs(hs.hotkey.getHotkeys()) do
      v['_hk']:enable()
   end
end

local function handleGlobalAppEvent(name, event, app)  
   if event == hs.application.watcher.activated then
      -- hs.alert.show(name)
      if name ~= "iTerm2" then
         enableAllHotkeys()
      else
         disableAllHotkeys()
      end
   end
end

appsWatcher = hs.application.watcher.new(handleGlobalAppEvent)  
appsWatcher:start()

-- カーソル移動
remapKey({'shift', 'cmd'}, 'l', keyCode('right'))  
remapKey({'shift', 'cmd'}, 'h', keyCode('left'))  
remapKey({'shift', 'cmd'}, 'j', keyCode('down'))  
remapKey({'shift', 'cmd'}, 'k', keyCode('up'))  
remapKey({'shift', 'cmd', 'ctrl'}, 'j', keyCode('pagedown'))  
remapKey({'shift', 'cmd', 'ctrl'}, 'k', keyCode('pageup'))  

これで、快適なエディター生活が送れるようになりました。