Karabiner を使ってターミナルの外でもラクラクカーソル移動生活
おはようございます,@ryota-ka です.
僕は Zsh の設定ファイルに bindkey -e
と書いている人種なのですが*1,いくつかの Emacs のキーバインディングは Cocoa の Text System でも使えるようになっていて便利ですよね.C-a
-> C-k
で move-beginning-of-line
-> kill-line
とかは本当によくお世話になっていますし,まったくカーソルキーを押すことなく生活ができるので,普段から心の平穏を保つことができています.
このデフォルトのキーバインディングの設定は, /System/Library/Frameworks/AppKit.framework/Resources/StandardKeyBinding.dict
に書いてあります.
$ plutil -convert xml1 /System/Library/Frameworks/AppKit.framework/Resources/StandardKeyBinding.dict -o - <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> (中略) <key>^a</key> <string>moveToBeginningOfParagraph:</string> <key>^b</key> <string>moveBackward:</string> <key>^d</key> <string>deleteForward:</string> <key>^e</key> <string>moveToEndOfParagraph:</string> <key>^f</key> <string>moveForward:</string> <key>^h</key> <string>deleteBackward:</string> <key>^k</key> <string>deleteToEndOfParagraph:</string> <key>^l</key> <string>centerSelectionInVisibleArea:</string> <key>^n</key> <string>moveDown:</string> <key>^o</key> <array> <string>insertNewlineIgnoringFieldEditor:</string> <string>moveBackward:</string> </array> <key>^p</key> <string>moveUp:</string> <key>^t</key> <string>transpose:</string> <key>^v</key> <string>pageDown:</string> <key>^y</key> <string>yank:</string> (中略) </dict> </plist>
また,私の場合,ターミナル上では Option キーを Esc キーとの同時押しとして振る舞うように割り当てていて,M-b
(backward-word
) や M-f
(forward-word
) はシェル上でもよく使うのですが,ターミナル以外のテキストフィールドで Option + b
/ Option + f
と押すと,当然のことながら ∫
/ ƒ
と入力されてしまいます.非常に残念です.この代替キー入力は,たまに非常に役に立つのですが,個人的には,今となってはあまり使う機会がなくなってしまいました*2.そこで,Option キーがターミナルの外でも Meta キーのように振る舞うように,Karabiner を使って設定することにしました.
実は,Option + Left
や Option + Right
でも単語間移動はできるのですが,実は Control + Option + b
や Control + Option + f
でもデフォルトで可能となっています.
$ plutil -convert xml1 /System/Library/Frameworks/AppKit.framework/Resources/StandardKeyBinding.dict -o - | grep -B 1 -E 'moveWord(Backward|Forward):' <key>~^b</key> <string>moveWordBackward:</string> -- <key>~^f</key> <string>moveWordForward:</string>
そこで,Option + b
を Control + Option + b
に,Option + f
を Control + Option + f
に remap するという方針で進めることとします.
前提
Karabiner をインストールしていること.
やり方
~/Library/Application\ Support/Karabiner/private.xml
を編集します.
vim ~/Library/Application\ Support/Karabiner/private.xml
<?xml version="1.0"?> <root> <item> <name>Option+b to Ctrl+Option+b</name> <identifier>remap.opt_b2ctrl_opt_b</identifier> <not>TERMINAL</not> <autogen> __KeyToKey__ KeyCode::B, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_OPTION, KeyCode::B, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_CONTROL, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_OPTION </autogen> </item> <item> <name>Option+f to Ctrl+Option+f</name> <identifier>remap.opt_f2ctrl_opt_f</identifier> <not>TERMINAL</not> <autogen> __KeyToKey__ KeyCode::F, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_OPTION, KeyCode::F, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_CONTROL, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_OPTION </autogen> </item> </root>
上述の通り,ターミナル内では既に Option キーを Esc キーとの同時押しとして振る舞うように設定しているため,<not>
でターミナルを除外しています.
ついでに単語削除もしたい
シェル上とか Vim の挿入モードとかで C-w
と打つと,カーソル前方の単語がひとつ削除されて,非常に便利です.なので,ついでにこちらも設定しておくことにしました.もうわざわざ Option + Delete
など押す必要もありません.
<item> <name>Ctrl+w to Option+Delete</name> <identifier>remap.ctrl_w2opt_del</identifier> <not>TERMINAL</not> <autogen> __KeyToKey__ KeyCode::W, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_CONTROL, KeyCode::DELETE, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_OPTION </autogen> </item>
最高に快適ですね.
その他のオススメ
Gyazo キーめっちゃ便利です.