KeyRemap4MacBookでの外だし設定XMLファイル&動的リロード

なんか最近KeyRemap4MacBookのことばっかり書いてる気もしますが、だって便利なんだから仕方ない。


正式バージョンとしてはまだリリースされてないですが、KeyRemap4MacBook-7.0.0から、独自の設定ファイルをそのまま外部XMLファイルとして管理できて、かつ、コンパネから動的リロードもできるようになりました。

今、開発版の6.99.22を試していますが、このバージョンからこの機能が使えています。


今までは設定を変更するたびにビルド&インストール作業*1が必要だったので、中々に敷居は高いものでした。
設定ファイルもソース管理の一貫なので、不慣れなMercurialを使ってみたり、干渉しないようにignoreを工夫してgitでオレオレ版の管理をしてみたり。結構大変だった。


それが今や設定ファイル一枚を任意の方法で管理しておけばいいだけになりました。


GUIでぽちっとするだけで簡単に動的リロードできるから試行錯誤もとても簡単です。


ちょっと導入ではまりかけたんですが、既存バージョンをそのままに最新版KeyRemmap4MacBookを上書きインストールした場合は、きちんと指示通りにOSを再起動しましょう。
以前とはだいぶ中の構造が違っているようで、OS再起動する前はキーバインド一覧が空っぽになったりしました。
慌てず騒がずOSを再起動すればOKです。


それからコンパネを開いて、Misc&InstallタブのOpen private.xmlボタンをクリックすると、Finderで/Users//Library/Application Supportフォルダが開きます。
ここにはいっているprivate.xmlにオレオレ設定を追加すればいいわけです。


設定ファイルは今までのcheckbox.xmlやlocal.top.xmlとほとんど同じなのですが、sysctlという設定項目のID的な要素が、identifierという要素名に変更になっています。sysctl→identifierと全置換すればOKです。sysctlってだいぶ以前の設計の名残りっぽいのが、やっときれいになった感じですね。負債を返済した感じ。


あと、わかりづらかったのが、private.xmlのルート要素としてデフォルトでroot要素が用意されてますが、なんかこれがいらないっぽくて、いきなりitem要素ではじめないと項目がうまく認識されませんでした。さらにちょっと微妙なことに一番外側のitemおよびlistがなぜか読み飛ばされてしまうので、オレオレ設定をすべて1つのツリーにぶらさげるには外側にダミーのitemとlistが1つずつ必要でした。

(11/26 00:50 訂正)開発者のid:takezoさんからいただいたコメントのとおり、root->listではじめるのが公式とのことなので、以下のオレオレ設定も修正しておきます。


ということで、private.xml用の最新設定をサラしておきます。

<root>
  <list>
    <item>
      <name>For nobeans</name>
      <list>
        <item>
          <name>PC style</name>
          <list>
            <item>
              <name>Control+X/C/V to Cut/Copy/Paste</name>
              <identifier>remap.controlXCV2copyPasteCut</identifier>
              <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>
              <identifier>remap.controlS2save</identifier>
              <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>
              <identifier>remap.controlZY2undoRedo</identifier>
              <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>
              <identifier>remap.controlW2closeWindow</identifier>
              <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>
              <identifier>remap.controlR2reload</identifier>
              <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>
              <identifier>remap.emacsmode_controlPNBF_nobeans</identifier>
              <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>
              <identifier>option.emacsmode_controlD_nobeans</identifier>
              <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>
              <identifier>option.emacsmode_controlH_nobeans</identifier>
              <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>
              <identifier>option.emacsmode_controlM_nobeans</identifier>
              <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>
              <identifier>option.emacsmode_controlAE_nobeans</identifier>
              <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>
              <identifier>remap.controlLtGt2pageUpDown</identifier>
              <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>
              <identifier>remap.controlLtGt2pageUpDown_Firefox</identifier>
              <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>
              <identifier>remap.controlLtGt2pageUpDown_Pc</identifier>
              <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>
              <identifier>remap.spaces_special_optionR_arrows</identifier>
              <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>
              <identifier>remap.terminal_special_ctrlTab</identifier>
              <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>
            <item>
              <name>Command+Escape to LeftClick</name>
              <identifier>remap.leftClick_nobeans</identifier>
              <autogen>--KeyToPointingButton-- KeyCode::ESCAPE, VK_COMMAND, PointingButton::LEFT</autogen>
            </item>
          </list>
        </item>
      </list>
    </item>
  </list>
</root>

Dropboxのファイルからシンボリックリンクをはってもいいし、ドットファイル系と一緒にgit+Dropboxで管理してもいいし、ずいぶん楽になりました。素晴らしい。

*1:SnowLeopard版からOS再起動は不要になってた