macOS Sierraでvimで Ctrl-[ でコマンドモードに抜けるときにIMEを無効化する処理をHammerspoonを使って設定してみました。
Hammerspoon
HammerspoonはmacOSに関する様々な処理を自動化するツールで以下のような機能を持っています。- キーリマップ
- アラート、通知の表示
- ウィンドウ操作(移動、リサイズ)
- ファイル変更の監視
- アプリケーションイベントの監視
- USB、Wifiイベントの監視
- AppleScriptの起動
- luaスクリプトで設定
キーリマップに関する設定は以下のリンク先が詳しいです。
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を無効化できるっぽいのですが以下の理由でダメでした。- Karabiner => macOS Sierra未対応。Sierraで使う場合はKarabiner-elementsを使うらしい
- Karabiner-Elements => 複数キーに対応していないのとIMEを無効化する方法がよくわからず…。
- Google IMEの設定で何とかする => Escapeはキー設定追加でうまくいったが、Ctrl-[はうまくいかず
- Keyhac => Command + Spaceで設定していたSpotlightが効かなくなったりして、うまくいかず