2017-01-23

macOS Sierraでキーリマップする

macOS Sierraでvimで Ctrl-[ でコマンドモードに抜けるときにIMEを無効化する処理をHammerspoonを使って設定してみました。

Hammerspoon

HammerspoonはmacOSに関する様々な処理を自動化するツールで以下のような機能を持っています。  

キーリマップに関する設定は以下のリンク先が詳しいです。

Ctrl-[でIMEを無効化しつつコマンドモードに戻る設定

Ctrl-[でIMEを無効化したい場合は ~/.hammerspoon/init.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 keyCodeSet(keys)
   return function()
      for i, keyEvent in ipairs(keys) do
         keyEvent()
      end
   end
end

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

remapKey({ 'ctrl' }, ']',  keyCodeSet({
    keyCode('escape'),
    keyCode(';', {'ctrl', 'shift'})
}))

hs.hotkey.bind({"cmd", "alt", "ctrl"}, "R", function()
  hs.reload()
end)
hs.alert.show("Config loaded")

下のcmd + alt + ctrl + Rの設定はしなくてもOK。Hammerspoonをいじってるとき、メニューバーからConfig Reloadするのが面倒だったのでショートカットキーに登録しています。

remapKey({ 'ctrl' }, ']' ... 部分でCtrl-[ のキー登録をしています。

なぜ ']' で登録しているかというと、HammerspoonのキーマップはUSキーボードの配列で判定されているらしく、JISキーボードの '[' はUSキーボードでは ']' になるためです。

ctrl + shift + ;は半角英数に切り替えるGoogle IMEのショートカットキーになります。

ちなみにEscapeもこの方法でやろうとするとescapeのショートカットキーがescapeを呼び出す無限ループになるので、Google IMEなどの方法でIMEを無効化するのが良いっぽいです。

他のツールで試してみた

一般的にはKarabiner、Google IMEの設定、KeyhacでIMEを無効化できるっぽいのですが以下の理由でダメでした。

参考URL

このエントリーをはてなブックマークに追加