KeyRemap4MacBookをカスタマイズする方法(最近のおすすめ版?)

KeyRemap4MacBookには大変にお世話になっているnobeansです。こんにちは。


オレオレなカスタマイズをして使ってたんですが、だいぶ古いバージョンのままになってました。


ちょっとした理由があってKeyRemap4MacBookを最新版に更新しないといけなくなったんですが、久しぶりにみたらRDC対応やiTerm2などソース部分をハックしてたところは普通にデフォで対応されてました。素晴らしい。


なので、オレオレ設定を記述したfiles/prefpane/checkbox.xmlの該当部分だけコピペすれば、最新版に簡単に移行できます。


で、checkbox.xmlだと、デフォの設定群とオレオレ設定が1ファイルに混在することになるんですけど、よくみるとfiles/prefpane/include/local.top.xmlというファイルが追加されてて、オレオレ設定はこれに書いておくと、ビルド時にcheckbox.xmlとマージされる仕組みができてました。素晴らしい。


というわけで、これからKeyRemap4MacBookを使い倒したい人はfiles/prefpane/include/local.top.xmlにオレオレ設定を書くようにすると良いですよ。


というお話。

自分の最新設定

一応はっておきます。

<!-- Put your private settings here -->
<item>
  <name>For nobeans</name>
  <list>
    <item>
      <name>PC style</name>
      <list>
        <item>
          <name>Control+X/C/V to Cut/Copy/Paste</name>
          <sysctl>remap.controlXCV2copyPasteCut</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>Control+S to Save</name>
          <sysctl>remap.controlS2save</sysctl>
          <not>VI, EMACS, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION, X11</not>
          <autogen>--KeyToKey-- KeyCode::S, VK_CONTROL, KeyCode::S, ModifierFlag::COMMAND_R</autogen>
        </item>
        <item>
          <name>Control+Z to Undo / Control+Y to Redo</name>
          <sysctl>remap.controlZY2undoRedo</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>Control+W to Window Close</name>
          <sysctl>remap.controlW2closeWindow</sysctl>
          <not>VI, EMACS, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION, X11</not>
          <autogen>--KeyToKey-- KeyCode::W, VK_CONTROL, KeyCode::W, ModifierFlag::COMMAND_R</autogen>
        </item>
        <item>
          <name>Control+R to Reload</name>
          <sysctl>remap.controlR2reload</sysctl>
          <not>VI, EMACS, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION, X11</not>
          <autogen>--KeyToKey-- KeyCode::R, VK_CONTROL, KeyCode::R, ModifierFlag::COMMAND_R</autogen>
        </item>
      </list>
    </item>
    <item>
      <name>Emacs style</name>
      <list>
        <item>
          <name>Control+PNBF to Up/Down/Left/Right</name>
          <appendix>(Only with modifier None or Shift)</appendix>
          <sysctl>remap.emacsmode_controlPNBF_nobeans</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>Control+D to Forward Delete</name>
          <appendix>(Without other modifiers; compatibile with Dictionary.app)</appendix>
          <sysctl>option.emacsmode_controlD_nobeans</sysctl>
          <not>VI, EMACS, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION, X11</not>
          <autogen>--KeyToKey-- KeyCode::D, VK_CONTROL | ModifierFlag::NONE, KeyCode::FORWARD_DELETE</autogen>
        </item>
        <item>
          <name>Control+H to Delete</name>
          <appendix>(Without other modifiers)</appendix>
          <sysctl>option.emacsmode_controlH_nobeans</sysctl>
          <not>VI, EMACS, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION, X11</not>
          <autogen>--KeyToKey-- KeyCode::H, VK_CONTROL | ModifierFlag::NONE, KeyCode::DELETE</autogen>
        </item>
        <item>
          <name>Control+M to Return</name>
          <appendix>(Without other modifiers)</appendix>
          <sysctl>option.emacsmode_controlM_nobeans</sysctl>
          <not>VI, EMACS, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION, X11</not>
          <autogen>--KeyToKey-- KeyCode::M, VK_CONTROL | ModifierFlag::NONE, KeyCode::RETURN</autogen>
        </item>
        <item>
          <name>Control+AE to Command+Left/Right</name>
          <appendix>(Only with modifier None or Shift)</appendix>
          <sysctl>option.emacsmode_controlAE_nobeans</sysctl>
          <not>VI, EMACS, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION, X11</not>
          <autogen>--KeyToKey-- KeyCode::A, VK_CONTROL | ModifierFlag::NONE, KeyCode::CURSOR_LEFT,  ModifierFlag::COMMAND_L</autogen>
          <autogen>--KeyToKey-- KeyCode::E, VK_CONTROL | ModifierFlag::NONE, KeyCode::CURSOR_RIGHT, ModifierFlag::COMMAND_L</autogen>
          <autogen>--KeyToKey-- KeyCode::A, VK_CONTROL | VK_SHIFT, KeyCode::CURSOR_LEFT,  ModifierFlag::COMMAND_L | ModifierFlag::SHIFT_L</autogen>
          <autogen>--KeyToKey-- KeyCode::E, VK_CONTROL | VK_SHIFT, KeyCode::CURSOR_RIGHT, ModifierFlag::COMMAND_L | ModifierFlag::SHIFT_L</autogen>
        </item>
      </list>
    </item>
    <item>
      <name>Original style</name>
      <list>
        <item>
          <name>Control+&lt; to PageUp / Control+&gt; to PageDown</name>
          <sysctl>remap.controlLtGt2pageUpDown</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>Control+&lt; to PageUp / Control+&gt; to PageDown</name>
          <appendix>(Not moving cursor only for Firefox)</appendix>
          <sysctl>remap.controlLtGt2pageUpDown_Firefox</sysctl>
          <only>FIREFOX</only>
          <autogen>--KeyToKey-- KeyCode::COMMA, VK_CONTROL, KeyCode::PAGEUP</autogen>
          <autogen>--KeyToKey-- KeyCode::DOT,   VK_CONTROL, KeyCode::PAGEDOWN</autogen>
        </item>
        <item>
          <name>Control+&lt; to PageUp / Control+&gt; to PageDown</name>
          <appendix>(Moving cursor as PC style)</appendix>
          <sysctl>remap.controlLtGt2pageUpDown_Pc</sysctl>
          <not>VI, EMACS, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION, X11, FIREFOX</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>Option_R+Arrow for Spaces</name>
          <sysctl>remap.spaces_special_optionR_arrows</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>Control+Tab to Change Tabs for Terminal</name>
          <sysctl>remap.terminal_special_ctrlTab</sysctl>
          <only>TERMINAL</only>
          <autogen>--KeyToKey-- KeyCode::TAB, VK_CONTROL | ModifierFlag::NONE, KeyCode::BRACKET_RIGHT, ModifierFlag::COMMAND_R | ModifierFlag::SHIFT_R</autogen>
          <autogen>--KeyToKey-- KeyCode::TAB, VK_CONTROL | VK_SHIFT | ModifierFlag::NONE, KeyCode::BRACKET_LEFT, ModifierFlag::COMMAND_R | ModifierFlag::SHIFT_R</autogen>
        </item>
      </list>
    </item>
  </list>
</item>

全然関係ないけどはまった件

ビルドスクリプトがrubyになってて、しかもrubygemsのlibxml-rubyに依存してるんですね。これ。
で、Macのデフォで入ってるruby/rubygemsだとエラーが出てしまってビルドができなかったので、MacPortsrubyとrb-rubygemsをインストールしてから、gem install libxml-rubyでgemもインストールしてあげたらうまくいきました。ふう。