KeyRemap4MacBookでオレオレなキーバインド設定をする方法

はじめに

KeyRemap4MacBookは、設定済みのコンフィギュレーションの中から選択してキーバインドをリマップしていくツールです。


なので、ちょっと他の人とは違うオレオレなキーバインドとかは自分でソースをいじらないといけません。


とはいえ、現在のリポジトリの最新ソースでは、普通の範囲のオレオレキーバインドXMLファイルをいじるだけで実現できてしまいます。
わかってみれば、結構簡単。簡単ではあるのですが、情報がなにせ少ない。


というわけで、超おおざっぱですが、ちょっとまとめてみました。

ソースの準備

↓この辺を参考に。
http://www.pqrs.org/tekezo/macosx/keyremap4macbook/source.html.ja


MercurialMacPortsでインストールしておけば、

$ hg clone http://hg.pqrs.org/KeyRemap4MacBook/

と実行するだけでとりだせます。すばらしい。

※このためにはじめてMercurialを触りましたが、ちょっと使うだけであればCVS/SVN使いとして特に違和感ないですね。


さて、以降ではソースを格納したルートディレクトリを仮に $SOURCE_HOME と呼ぶことにします。

キーバインド定義XMLファイル

変にトリッキーなもの(2ストローク系とか)以外のキーバインドは、$SOURCE_HOME/files/prefpane/checkbox.xml ファイルを編集するだけでOKです。


ファイル名から察するに、経緯的にシステム環境設定でのチェックボックス表示のための定義ファイルだったようですが、リポジトリ最新版では、なんとこのファイルを元に必要なソースを自動生成することができるのです。すばらしい。


このファイルの仕様を細々と説明するのは疲れるので、後述のオレオレ設定を読んで察してください。


ちょっとだけ箇条書きにしてみます。

  • が1つのキーバインド設定に対応している
  • でグルーピングできる
  • のテキスト子要素は、ユニークな文字列を指定すること
  • で、そのキーバインドの対象外とするアプリを指定できる。カンマ区切りで複数指定可能。デフォルトで、VI, EMACS, TERMINALとかがかける。
    • 同じくで、そのキーバインドの対象とするアプリを限定指定できる。
    • 詳しく知りたい場合は、$SOURCE_HOME配下を TERMINAL などでgrepして、ヒットしたコードを読めばOK. それほど難しくなく好きなアプリを対象として追加できる。
  • が実際のキーバインドを表す。複数かける。
    • --KeyToKey-- で始まるものは、あるキーを別のキーに置換する。
    • 修飾キー(Controlとか)は、ModifierFlag::CONTROL_R などと指定する。複数の修飾キーの同時押しは「|」で列挙する。


これぐらい知ってればどうにかなるんじゃないかと。

オレオレ設定の一部

さて、現在のオレオレ設定の一部をさらします。
自分では割と普通のマッピングだと思ってますが、PAGE_UP/PAGE_DOWNとかはめずらしいタイプかも。

    <item>
      <name>For nobeans</name>
      <list>
        <item>
          <name>Ctrl+XCV to Cut/Copy/Paste</name>
          <sysctl>remap.nobeans_copypastecut</sysctl>
          <not>VI, EMACS, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION, X11</not>
          <autogen>--KeyToKey-- KeyCode::X, VK_CONTROL, KeyCode::X, ModifierFlag::COMMAND_R</autogen>
          <autogen>--KeyToKey-- KeyCode::C, VK_CONTROL, KeyCode::C, ModifierFlag::COMMAND_R</autogen>
          <autogen>--KeyToKey-- KeyCode::V, VK_CONTROL, KeyCode::V, ModifierFlag::COMMAND_R</autogen>
        </item>
        <item>
          <name>Ctrl+S to Save</name>
          <sysctl>remap.nobeans_save</sysctl>
          <not>VI, EMACS, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION, X11</not>
          <autogen>--KeyToKey-- KeyCode::S, VK_CONTROL, KeyCode::S, ModifierFlag::COMMAND_R</autogen>
        </item>
        <item>
          <name>Ctrl+Z to Undo / Ctrl+Y to Redo</name>
          <sysctl>remap.nobeans_undoredo</sysctl>
          <not>VI, EMACS, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION, X11</not>
          <autogen>--KeyToKey-- KeyCode::Z, VK_CONTROL, KeyCode::Z, ModifierFlag::COMMAND_R</autogen>
          <autogen>--KeyToKey-- KeyCode::Y, VK_CONTROL, KeyCode::Z, ModifierFlag::COMMAND_R | ModifierFlag::SHIFT_R</autogen>
        </item>
        <item>
          <name>Ctrl+W to Window Close</name>
          <sysctl>remap.nobeans_closewindow</sysctl>
          <not>VI, EMACS, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION, X11</not>
          <autogen>--KeyToKey-- KeyCode::W, VK_CONTROL, KeyCode::W, ModifierFlag::COMMAND_R</autogen>
        </item>
        <item>
          <name>Ctrl+R to Reload</name>
          <sysctl>remap.nobeans_reload</sysctl>
          <not>VI, EMACS, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION, X11</not>
          <autogen>--KeyToKey-- KeyCode::R, VK_CONTROL, KeyCode::R, ModifierFlag::COMMAND_R</autogen>
        </item>
        <item>
          <name>Ctrl+&lt; to PageUp / Ctrl+&gt; to PageDown</name>
          <sysctl>remap.nobeans_controlLtGt</sysctl>
          <not>VI, EMACS, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION, X11</not>
          <autogen>--KeyToKey-- KeyCode::COMMA, VK_CONTROL, KeyCode::PAGEUP</autogen>
          <autogen>--KeyToKey-- KeyCode::DOT,   VK_CONTROL, KeyCode::PAGEDOWN</autogen>
        </item>
        <item>
          <name>Ctrl+&lt; to PageUp / Ctrl+&gt; to PageDown (PC style)</name>
          <sysctl>remap.nobeans_controlLtGtPc</sysctl>
          <not>VI, EMACS, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION, X11</not>
          <autogen>--KeyToKey-- KeyCode::COMMA, VK_CONTROL, KeyCode::PAGEUP, ModifierFlag::OPTION_L</autogen>
          <autogen>--KeyToKey-- KeyCode::DOT,   VK_CONTROL, KeyCode::PAGEDOWN, ModifierFlag::OPTION_L</autogen>
        </item>
        <item>
          <name>Control+PNBF to Up/Down/Left/Right</name>
          <sysctl>remap.nobeans_controlPNBF</sysctl>
          <not>VI, EMACS, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION, X11</not>
          <autogen>--KeyToKey-- KeyCode::P, ModifierFlag::CONTROL_L | ModifierFlag::NONE, KeyCode::CURSOR_UP</autogen>
          <autogen>--KeyToKey-- KeyCode::N, ModifierFlag::CONTROL_L | ModifierFlag::NONE, KeyCode::CURSOR_DOWN</autogen>
          <autogen>--KeyToKey-- KeyCode::B, ModifierFlag::CONTROL_L | ModifierFlag::NONE, KeyCode::CURSOR_LEFT</autogen>
          <autogen>--KeyToKey-- KeyCode::F, ModifierFlag::CONTROL_L | ModifierFlag::NONE, KeyCode::CURSOR_RIGHT</autogen>
          <autogen>--KeyToKey-- KeyCode::P, ModifierFlag::CONTROL_L | VK_SHIFT | ModifierFlag::NONE, KeyCode::CURSOR_UP,    ModifierFlag::SHIFT_R</autogen>
          <autogen>--KeyToKey-- KeyCode::N, ModifierFlag::CONTROL_L | VK_SHIFT | ModifierFlag::NONE, KeyCode::CURSOR_DOWN,  ModifierFlag::SHIFT_R</autogen>
          <autogen>--KeyToKey-- KeyCode::B, ModifierFlag::CONTROL_L | VK_SHIFT | ModifierFlag::NONE, KeyCode::CURSOR_LEFT,  ModifierFlag::SHIFT_R</autogen>
          <autogen>--KeyToKey-- KeyCode::F, ModifierFlag::CONTROL_L | VK_SHIFT | ModifierFlag::NONE, KeyCode::CURSOR_RIGHT, ModifierFlag::SHIFT_R</autogen>
        </item>
        <item>
          <name>Option_R+Arrow for Spaces</name>
          <sysctl>remap.nobeans_spaces</sysctl>
          <autogen>--KeyToKey-- KeyCode::CURSOR_UP,    ModifierFlag::OPTION_R, KeyCode::CURSOR_UP,    ModifierFlag::CONTROL_L</autogen>
          <autogen>--KeyToKey-- KeyCode::CURSOR_DOWN,  ModifierFlag::OPTION_R, KeyCode::CURSOR_DOWN,  ModifierFlag::CONTROL_L</autogen>
          <autogen>--KeyToKey-- KeyCode::CURSOR_LEFT,  ModifierFlag::OPTION_R, KeyCode::CURSOR_LEFT,  ModifierFlag::CONTROL_L</autogen>
          <autogen>--KeyToKey-- KeyCode::CURSOR_RIGHT, ModifierFlag::OPTION_R, KeyCode::CURSOR_RIGHT, ModifierFlag::CONTROL_L</autogen>
        </item>
        <item>
          <name>Command+F4 for Quit</name>
          <sysctl>remap.nobeans_quit</sysctl>
          <autogen>--KeyToKey-- KeyCode::F4,    ModifierFlag::COMMAND_L, KeyCode::Q, ModifierFlag::COMMAND_L</autogen>
        </item>
      </list>
    </item>

ビルド&上書きインストール

さて、設定ファイルがかけたら、ビルドしてインストールします。
これは超簡単。

$ cd $SOURCE_HOME
$ make clean && make && open KeyRemap4MacBook-5.1.60.pkg
※pkgのバージョンは、ベースとしたソースのバージョンによって異なります。
※cleanは不要かもしれないけど、一応念のためクリーンビルドしておきます。

設定ファイルが間違ってればエラーが出るので、メッセージを読んでがんばって修正してください。


うまくいくと、インストーラが起動します。
いつも通りナビゲーションに従ってインストールします。
インストール済みであっても問題なく上書きインストールしてくれます。


さて、インストール完了画面が表示されると再起動ボタンしか押せなくなっていますが、
試行錯誤中にいちいち再起動していると面倒くさすぎなので、Command+Qでガツンとインストーラを終了させます。


ただし、ここで再起動をしない場合、アプリごとの設定ON/OFF設定が無効化されてしまい、TERMINALな設定であろうとターミナルでリマップされてしまいます。
これがちょっと困る点。これがなければかなりよいキーリマップツールなんですけどねー。


動作確認

システム環境設定を起動して(すでに起動中の場合はいったん再起動)、追加/変更した設定をチェックして、動作を確認します。


XMLファイルを変更するときにの値が変わってなければ、チェック状態もそれまでの状態を引き継ぎます。
sysctrlの値をキーに状態を管理しているようです。


さて、思ったように動くようであれば、最後にOSを再起動して完了です。

おわりに

今までWindowsで使っていたオレオレなキーバインドとほぼ同様の設定が実現できました。
おかげさまで、長いブランクがありましたが、それほど問題もなくMacに戻ってこれました。
ありがとうございます。>作者様


最近、窓使いの憂鬱 for MacOSX が誕生したようですが、現時点ではまだ様子見かな、と。
とはいえ、Windowsでは大変にお世話になったので、そのうち完成度があがってきたら乗り換えるかも。

おまけ:ちょっとだけグチ

WindowsのHOME/END, PAGE_UP/PAGE_DOWNの動作になれてしまっているので、Macの振る舞いには違和感ありまくり。

  • HOME/ENDが、場合によって「ページ先頭/末尾」「行頭/行末」を判断してうまくやってくれない
  • PAGE_UP/PAGE_DOWNでカーソルが移動していかない

特に後者には納得がいかない・・・。