読者です 読者をやめる 読者になる 読者になる

KeyRemap4MacBook に独自のリマップ定義を追加すると便利

Mac

KeyRemap4MacBookMacBook に限らず Mac を使っていて入力環境に少なからずこだわる人はだいたい使っていると思う。

自分もずっと使っていて、たとえば SandS にしてみたり、セミコロンとコロンを入れ替えてみたり、自分の手の馴染むようにいろいろカスタマイズしている。

最近、private.xml の書き方がわかってきて、いろいろ自分で好みの設定を追加したらたいへん便利になったので共有する。

ターミナル・マルチプレクサ (tmux) を OS X ネイティヴのように操作する

たとえば Mac だと Command-[ とか Command-shift-[ とかでウィンドウやタブを移動できるようになってたりする。

これと同じような感覚で tmux のウィンドウも移動してみたい。

<?xml version="1.0"?>
<root>
  <appdef>
    <appname>TERMINAL</appname>
    <equal>com.googlecode.iterm2</equal>
  </appdef>

  <item>
   <name>tmux integration</name>
    <item>
      <name>Move the window (Next)</name>
      <only>TERMINAL</only>
      <identifier>org.aereal.tmux.move-the-window-next</identifier>
      <autogen>--KeyToKey-- KeyCode::BRACKET_RIGHT, VK_COMMAND | VK_SHIFT, KeyCode::Q, VK_CONTROL, KeyCode::N</autogen>
    </item>
    <item>
      <name>Move the window (Previous)</name>
      <only>TERMINAL</only>
      <identifier>org.aereal.tmux.move-the-window-previous</identifier>
      <autogen>--KeyToKey-- KeyCode::BRACKET_LEFT, VK_COMMAND | VK_SHIFT, KeyCode::Q, VK_CONTROL, KeyCode::P</autogen>
    </item>
  </item>
</root>

item 要素が KeyRemap4MacBook.prefPane の項目に対応している。

name 要素は見出し、identifier は識別子で逆ドメイン (Java のパッケージ名とかでよく見るやつ) を見かけたのでなんとなくそれに合わせているけど、識別子だから被らなければ大丈夫だと思う。

ほか、onlyappendix, appdef といった要素もあるが、詳しい説明は 公式のドキュメント に譲る。

実際のリマップを指定するのは autogen 要素のテキストノードになる。

KeyToKey だとひとつ以上のキーシーケンスをひとつ以上のキーシーケンスに対応させる。

詳しい説明は公式のドキュメントに譲ることとして、簡単に上記のコードを説明すると「VK_COMMAND と VK_SHIFT という仮想キーシーケンスが組み合わされた BRACKET_LEFT というキーを、VK_CONTROL で修飾された Q, 修飾キーなしの P というシーケンスに置き換える」という風になる。

tmux のプレフィックス・キーを C-q に設定してあるので、つまり Command-Shift-[C-q p というキーシーケンスに変換されて、「前のウィンドウへ移動」できる、ということになる。

tmux のプレフィックス・キーを楽に入力する

tmux (に限らず、ターミナル・マルチプレクサの類) のプレフィックス・キーは選べるキーが少ないため、他のアプリケーションと衝突することもあるし、打鍵しづらくなりがち。

そもそも衝突しなさそうな (しても弊害の少ない) プレフィックス・キーを選んで、ターミナル・マルチプレクサの手前で打鍵しやすいキーシーケンスをプレフィックス・キーに置き換える、という方法がバランスがよさそうであるので、その方針でいく。

<?xml version="1.0"?>
<root>
  <item>
    <name>Double-tap Command_R to tmux prefix key on Terminal application</name>
    <identifier>org.aereal.double-tap-command-r-to-tmux-prefix-key</identifier>
    <only>TERMINAL</only>
    <autogen>--DoublePressModifier-- KeyCode::COMMAND_R, KeyCode::COMMAND_R, KeyCode::Q, ModifierFlag::CONTROL_L</autogen>
  </item>
</root>

上記のコードは Command R (Right, 右の Command キー) のダブルプレスを Control で修飾された Q というシーケンスに置き換える。

ほかにも

いろいろ書いてる。

dotfiles/osx/keyremap4macbook/private.xml at master · aereal/dotfiles · GitHub

GitHub のリポジトリにいろいろ追加している。

参考

KeyRemap4MacBook のコアで用意されているリマップもすべてこの XML で定義されている。「Option キーのみ押下したら英数キーとしたい」とか、既存のリマップ定義をちょっといじるだけでできたりするので、実際のコードを読むのが一番ためになりそう。

余談

カスタマイズとポータビリティのバランスは重要だと思っている。

カスタマイズしてある環境におけるパフォーマンスを最大化するとポータビリティが損われ、普段の環境とは違う環境で作業すると著しく効率が下がる、といったことが起きる。

ポータビリティを保とうとすると、「どこでもそこそこの効率で成果を出せる」ということになったりもする。

たとえば多くの OS でデフォルトで使えるから、という理由で bash を使っている人もいる。

もっとハードコアになると、そもそもカスタマイズすること自体が少なからずポータビリティを損うため、一切のカスタマイズをしない、という人もいる。

自分の場合は、ポータビリティよりパフォーマンスを重要視している。

インフラストラクチャを専門領域として複数のリモートサーバに頻繁にログインしてなにかするような人ではなく、アプリケーション・エンジニアとして基本的には自分の端末で作業する (できる) 環境にある。

ある程度、環境を固定できるという強みを活かして、多少、ポータビリティを犠牲にしてでもパフォーマンスを最大化できるようにしている。