[ Mac ] Vim/Emacs/VSCode/PyCharm向けKarabinerカスタマイズ

# 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/```以下に保存します

```private.xml
<?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>

```

### カスタム設定をリロードし、チェックを入れます

1. 最初に「Reload XML」をクリックして先ほどのprivate.xmlをリロードします
2. Change KeyタブにPrivate Mappingの項目ができるので、全部にチェックを入れます

※ For Japaneseはお好みで

![karabiner.jpg](https://qiita-image-store.s3.amazonaws.com/0/102012/24eb4cef-8bd3-f3e1-0ea5-38441c81480d.jpeg)


## 使う
便利！！！！！

## 特筆事項など
### Application Bundle Identiferを調べる
ターゲットとなるアプリケーションのApplication Bundle Identifer(com.apple.Terminalとか)を調べるにはEvent Viewerを使います。

1. Spotlightでeventで検索すると出てくるので起動します
2. 対象のアプリを起動し、Appタブで確認します
3. なぜかEvent Viewerはcmd+Qでアプリケーション終了できないので、Application Bundle Identiferを調べ終わったらメインメニューからQuit EventViewerで。

![eventviewer.jpg](https://qiita-image-store.s3.amazonaws.com/0/102012/192aa781-e60c-9c7c-8eba-c8175f983fd0.jpeg)

### 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に関する設定をすべて削除できました)

```keybindings.json
// 既定値を上書きするには、このファイル内にキーバインドを挿入します
[
    {
        "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"
    }
]
```

もちろん、エディタだけでなく色々なソフトのキーイベントを自分ごのみにカスタマイズしてはいかがでしょうか。

## 参考サイト
- [Karabiner の private.xml 設定方法](http://qiita.com/altitude3190/items/bbef986ff8dd288b2641)
- [VS CodeのゆるふわEmacs風カスタマイズ - Qiita](http://qiita.com/kickbase/items/622e4b39e257286c1a25)