Karabiner を使ってターミナルの外でもラクラクカーソル移動生活

おはようございます,@ryota-ka です.

僕は Zsh の設定ファイルに bindkey -e と書いている人種なのですが*1,いくつかの Emacs のキーバインディングCocoa の Text System でも使えるようになっていて便利ですよね.C-a -> C-kmove-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 + LeftOption + Right でも単語間移動はできるのですが,実は Control + Option + bControl + 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 + bControl + Option + b に,Option + fControl + 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 キーめっちゃ便利です.

qiita.com

参考

*1:これをネタにたまに同志たちから糾弾されますが,シェルでは明らかにこちらの方が使いやすいと個人的には思っています

*2:大学の授業に出てノートを取っていた頃は,Option + d で ∂ が一発で打てたりとか(ミクロ経済学),Option + e で Umlaut,Option + s で ß が入力できたりだとか(ドイツ語中級)は非常に重宝していました.