Karabinerをカスタマイズしてアプリケーションごとにキーボードの挙動を変えよう
エディタを色々使っていると、そのソフトごとにキーイベントを変更したいときがあります。
.vimrcやinit.el、その他ソフトの環境設定でできることもありますが、エディタ内の設定だけでは難しい処理もKarabinerを使えばうまくいく場合があります。
今回は特に下記を実現させてみました。
- 端末上のVimでCtrl+Cを押すとエスケープ後自動で英数入力に切り替える(ノーマルモードに戻ったとき、すぐコマンドを使いたい!)
- 端末上のEmacsでCtrl+Gを押すとエスケープ後自動で英数入力に切り替える
- VSCodeでCtrl+Cを押すとコマンドパレットなども閉じたい(マルチカーソルの解除等もしたい)
- [追記] VSCodeでコマンドパレットなどでもC-n/C-pで選択、C-mで確定機能を追加しました!
※ 本記事のKarabinerは現行最新バージョンの10.18.0を使用しています
設定方法
はじめに設定方法を記載し、特筆事項は後述します。
private.xmlの設定
private.xmlを/Users/[ユーザー名]/Library/Application Support/Karabiner/
以下に保存します
<?xml version="1.0"?>
<root>
<appdef>
<appname>TERMINAL</appname>
<equal>com.apple.Terminal</equal>
</appdef>
<appdef>
<appname>ITERM2</appname>
<equal>com.googlecode.iterm2</equal>
</appdef>
<appdef>
<appname>PYCHARM</appname>
<equal>com.jetbrains.pycharm</equal>
</appdef>
<appdef>
<appname>VSCODE</appname>
<equal>com.microsoft.VSCode</equal>
</appdef>
<windownamedef>
<name>VIM</name>
<regex>.*vim.*</regex>
</windownamedef>
<windownamedef>
<name>EMACS</name>
<regex>.*emacsclient.*</regex>
</windownamedef>
<item>
<name>Private Mapping</name>
<!-- vim -->
<item>
<name>Custom Vim Change CONTROL_C+EISUU</name>
<identifier>private.control_C_plus_eisuu</identifier>
<only>TERMINAL,ITERM2</only>
<windowname_only>VIM</windowname_only>
<autogen>
__KeyToKey__
KeyCode::C, ModifierFlag::CONTROL_L,
KeyCode::JIS_EISUU, KeyCode::C, ModifierFlag::CONTROL_L
</autogen>
</item>
<item>
<name>Custom Vim Change ESC+EISUU</name>
<identifier>private.escape_plus_eisuu</identifier>
<only>TERMINAL,ITERM2</only>
<windowname_only>VIM</windowname_only>
<autogen>
__KeyToKey__
KeyCode::ESCAPE,
KeyCode::JIS_EISUU, KeyCode::ESCAPE
</autogen>
</item>
<!-- Emacs -->
<item>
<name>Custom Emacs Change CONTROL_G+EISUU</name>
<identifier>private.control_g_plus_eisuu</identifier>
<only>TERMINAL,ITERM2</only>
<windowname_only>EMACS</windowname_only>
<autogen>
__KeyToKey__
KeyCode::G, ModifierFlag::CONTROL_L,
KeyCode::JIS_EISUU, KeyCode::G, ModifierFlag::CONTROL_L
</autogen>
</item>
<!-- PyCharm -->
<item>
<name>Custom PyCharm Change CONTROL_C+EISUU</name>
<identifier>private.control_C_plus_eisuu_pycharm</identifier>
<only>PYCHARM</only>
<autogen>
__KeyToKey__
KeyCode::C, ModifierFlag::CONTROL_L,
KeyCode::JIS_EISUU, KeyCode::ESCAPE
</autogen>
</item>
<item>
<name>Custom PyCharm Change ESC+EISUU</name>
<identifier>private.escape_plus_eisuu_pycharm</identifier>
<only>PYCHARM</only>
<autogen>
__KeyToKey__
KeyCode::ESCAPE,
KeyCode::JIS_EISUU, KeyCode::ESCAPE
</autogen>
</item>
<!-- VSCode -->
<item>
<name>Custom VSCode Ctrl+C to ESC</name>
<identifier>private.ctrl_c_to_escape_vscode</identifier>
<only>VSCODE</only>
<autogen>
__KeyToKey__
KeyCode::C, ModifierFlag::CONTROL_L,
KeyCode::JIS_EISUU, KeyCode::ESCAPE
</autogen>
</item>
<item>
<name>Custom VSCode Ctrl+N to Cursor Down</name>
<identifier>private.ctrl_n_to_cursor_down_vscode</identifier>
<only>VSCODE</only>
<autogen>
__KeyToKey__
KeyCode::N, ModifierFlag::CONTROL_L,
KeyCode::CURSOR_DOWN
</autogen>
</item>
<item>
<name>Custom VSCode Ctrl+P to Cursor Up</name>
<identifier>private.ctrl_p_to_cursor_up_vscode</identifier>
<only>VSCODE</only>
<autogen>
__KeyToKey__
KeyCode::P, ModifierFlag::CONTROL_L,
KeyCode::CURSOR_UP
</autogen>
</item>
<item>
<name>Custom VSCode Ctrl+M to Return</name>
<identifier>private.ctrl_m_to_return_vscode</identifier>
<only>VSCODE</only>
<autogen>
__KeyToKey__
KeyCode::M, ModifierFlag::CONTROL_L,
KeyCode::RETURN
</autogen>
</item>
</item>
</root>
カスタム設定をリロードし、チェックを入れます
- 最初に「Reload XML」をクリックして先ほどのprivate.xmlをリロードします
- Change KeyタブにPrivate Mappingの項目ができるので、全部にチェックを入れます
※ For Japaneseはお好みで
使う
便利!!!!!
特筆事項など
Application Bundle Identiferを調べる
ターゲットとなるアプリケーションのApplication Bundle Identifer(com.apple.Terminalとか)を調べるにはEvent Viewerを使います。
- Spotlightでeventで検索すると出てくるので起動します
- 対象のアプリを起動し、Appタブで確認します
- なぜかEvent Viewerはcmd+Qでアプリケーション終了できないので、Application Bundle Identiferを調べ終わったらメインメニューからQuit EventViewerで。
Vim
僕は端末のVimしか使わないのでMacVimなどを使っている人は設定が変わると思います。
Ctrl+CでNormalモードに戻った際日本語入力が続くのは非常にストレスなので、オススメな設定です。
もちろん、Ctrl+[に本設定を割り当てても良いでしょう
VSCode
はじめはVSCodeのデフォルトショートカットから"escape"に割り当てられているものをすべて抜き出し、ctrl+cに追加割当してみました。
が、コマンドパレットなどはctrl+cで抜けられませんでした。これはイライラする!ということで、Karabinerを使った方法に切り替えたところうまくいったので、上記keybinding.jsonの設定は不要になりました。
また、C-n/C-p/C-mの機能をKarabinerに持たせたことにより、VSCode側のキーボード設定(keybindings.json)が非常にシンプルになりました。
最終的にVSCode側のキーボード設定は下記の通りになりました。(C-n/C-p/C-m/C-cに関する設定をすべて削除できました)
// 既定値を上書きするには、このファイル内にキーバインドを挿入します
[
{
"key": "shift+cmd+\\",
"command": "workbench.action.splitEditor"
},
{
"key": "cmd+ctrl+l",
"command": "editor.action.format",
"when": "editorTextFocus"
},
{
"key": "ctrl+i",
"command": "jumpToNextSnippetPlaceholder",
"when": "editorTextFocus && inSnippetMode"
},
{
"key": "cmd+ctrl+r",
"command": "workbench.action.tasks.runTask"
},
{
"key": "cmd+ctrl+x",
"command": "workbench.action.tasks.terminate"
}
]
もちろん、エディタだけでなく色々なソフトのキーイベントを自分ごのみにカスタマイズしてはいかがでしょうか。