6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-04-29

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

使う

便利!!!!!

特筆事項など

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

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"
    }
]

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

参考サイト

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?