KeyRemap4MacBook を Humphrey (Snow Leopard) にインストールする

今まで KeyRemap4MacBook 5.1.0 に自作の Dvorak patch を当てたものを使ってきたのだけれど、 32 ビットモードでコンパイルしていたため、 環境設定を開くたびに一旦システム環境設定を起動し直していたのが煩わしかった。 まあ、 再起動は自動的に行われるので手間はないのだけれど、 うざったいと言えばうざったい。

そこで Snow Leopard に対応している 6.4.0 をインストールすることにした。 以前(2009-07-03 Fri)に 開発版の KeyRemap4MacBook 5.1.60 を試した時はうまく動かなかったので、 ちょっとドキドキものだったが無事インストールすることができた。

ただやはり入力ソースを Dvorak にして、 Emacs Mode の Control+PNBF to Up/Down/Left/Right や Option+BF to Option+Left/Right にチェックを入れると、 物理キーボード配列の Control+PNBF、 Option+BF が有効になってしまう。

まあこれは KeyRemap4MacBook 側ではどうしようもないだろう。 そこで今度も KeyRemap4MacBook のソースを改造して、 Change Keyboard Layout のグループに Dvorak Layout を追加してみる。

しかし 6.4.0 も 5.1.60 の時と同じように、 Emacs Mode の Control+PNBF to Up/Down/Left/Right では Dvorak Layout の Control+PNBF と U.S. 配列の Control+PNBF の両方にリマップがかかってしまう。 (5.1.0 の時はうまく動いていたのだけれど。 5.1.0 と 5.1.60 の間に結構大きな修正が入っている様子。) つまり:

  • まず、 Dvorak Layout の Control+PNBF は U.S. 配列の Control+RLNY にリマップされ、
  • 次に、U.S 配列の Control+PNBF にリマップされる。
その結果、 U.S. 配列でいう Control+PNBFRLY は ↑↓←→↑↓→ にマップされる。 したがって Dvorak 配列のつもりで Control+B (左へカーソルを移動)を押すと、 ↓ (一行下へカーソルを移動)を押したことになってしまうというわけだ。 これはかなりイライラする。

そこでダーティーだがお手軽な方法として、 Emacs Mode の Control+PNBF to Up/Down/Left/Right を、 Control+RYLN to Up/Down/Left/Right となるように改造することにした。 ただオリジナルの設定項目をなくすのもためらわれたので、 項目を Dvorak's Control+PNBF to Up/Down/Left/Right として追加することにした。 同様に Option+BF to Option+Left/Right、 Option+D to Option+Forward Delete も。

ここで、 Control+PNBF to Up/Down/Left/Right は、 Exposé でウィンドウを選択できるようにするため。 Option+BF to Option+Left/Right、Option+D to Option+Forward Delete は、 ことえりひらがな入力モードになっている時に Option+BFD を押すと bfd を変換しようとしてしまうのを防ぐためである。

以下に Dvorak 対応 patch を書いておく。 一応最後の方に Dvorak Layout も入っているけれども、 キーボードの入力ソースとして Dvorak を使っている場合はチェック不要である。 Dvorak 配列の時に Emacs Mode で Control+PNBF to Up/Down/Left/Right、 Option+BF to Option+Left/Right、 Option+D to Option+Forward Delete を使いたい場合は、 その次の行の Dvorak's Control+PNBF to Up/Down/Left/Right などをチェックすればよい。

最後に、このような便利なツールを公開してくれている作者の方に感謝。

diff -Naru KeyRemap4MacBook-6.4.0.orig/files/prefpane/checkbox.xml KeyRemap4MacBook-6.4.0/files/prefpane/checkbox.xml
--- KeyRemap4MacBook-6.4.0.orig/files/prefpane/checkbox.xml	2010-01-18 23:56:34.000000000 +0900
+++ KeyRemap4MacBook-6.4.0/files/prefpane/checkbox.xml	2010-03-14 19:28:22.000000000 +0900
@@ -2101,6 +2101,16 @@
           <!-- #include "include/emacsmode_controlPNBF.xml" -->
         </item>
         <item>
+          <name>Dvorak's Control+PNBF to Up/Down/Left/Right</name>
+          <sysctl>option.dvorak_emacsmode_controlPNBF</sysctl>
+          <not>EMACS, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION, X11, ECLIPSE</not>
+          <autogen>--KeyToKey-- KeyCode::R, VK_CONTROL, KeyCode::CURSOR_UP</autogen>
+          <autogen>--KeyToKey-- KeyCode::Y, VK_CONTROL, KeyCode::CURSOR_RIGHT</autogen>
+          <autogen>--KeyToKey-- KeyCode::L, VK_CONTROL, KeyCode::CURSOR_DOWN</autogen>
+          <autogen>--KeyToKey-- KeyCode::N, VK_CONTROL, KeyCode::CURSOR_LEFT</autogen>
+
+        </item>
+        <item>
           <name>Control+V to PageDown</name>
           <sysctl>option.emacsmode_controlV</sysctl>
           <not>EMACS, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION, X11, ECLIPSE</not>
@@ -2165,12 +2175,25 @@
           <autogen>--KeyToKey-- KeyCode::F, VK_OPTION, KeyCode::CURSOR_RIGHT, ModifierFlag::OPTION_L</autogen>
         </item>
         <item>
+          <name>Dvorak's Option+BF to Option+Left/Right</name>
+          <sysctl>option.dvorak_emacsmode_optionBF</sysctl>
+          <not>EMACS, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION, X11, ECLIPSE</not>
+          <autogen>--KeyToKey-- KeyCode::Y, VK_OPTION, KeyCode::CURSOR_RIGHT, ModifierFlag::OPTION_L</autogen>
+          <autogen>--KeyToKey-- KeyCode::N, VK_OPTION, KeyCode::CURSOR_LEFT, ModifierFlag::OPTION_L</autogen>
+        </item>
+        <item>
           <name>Option+D to Option+Forward Delete</name>
           <sysctl>option.emacsmode_optionD</sysctl>
           <not>EMACS, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION, X11, ECLIPSE</not>
           <autogen>--KeyToKey-- KeyCode::D, VK_OPTION, KeyCode::FORWARD_DELETE, ModifierFlag::OPTION_L</autogen>
         </item>
         <item>
+          <name>Dvorak's Option+D to Option+Forward Delete</name>
+          <sysctl>option.dvorak_emacsmode_optionD</sysctl>
+          <not>EMACS, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION, X11, ECLIPSE</not>
+          <autogen>--KeyToKey-- KeyCode::H, VK_OPTION, KeyCode::FORWARD_DELETE, ModifierFlag::OPTION_L</autogen>
+        </item>
+        <item>
           <name>Option+&lt; to Home / Option+&gt; to End</name>
           <sysctl>option.emacsmode_optionLtGt</sysctl>
           <not>EMACS, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION, X11, ECLIPSE</not>
@@ -2996,6 +3019,43 @@
           <autogen>--KeyToKey-- KeyCode::SEMICOLON, KeyCode::P</autogen>
         </item>
         <item>
+          <name>Use Dvorak Keyboard Layout</name>
+          <sysctl>remap.qwerty2dvorak</sysctl>
+          <autogen>--KeyToKey-- KeyCode::MINUS, KeyCode::BRACKET_LEFT</autogen>
+          <autogen>--KeyToKey-- KeyCode::EQUAL, KeyCode::BRACKET_RIGHT</autogen>
+          <autogen>--KeyToKey-- KeyCode::Q, KeyCode::QUOTE</autogen>
+          <autogen>--KeyToKey-- KeyCode::W, KeyCode::COMMA</autogen>
+          <autogen>--KeyToKey-- KeyCode::E, KeyCode::DOT</autogen>
+          <autogen>--KeyToKey-- KeyCode::R, KeyCode::P</autogen>
+          <autogen>--KeyToKey-- KeyCode::T, KeyCode::Y</autogen>
+          <autogen>--KeyToKey-- KeyCode::Y, KeyCode::F</autogen>
+          <autogen>--KeyToKey-- KeyCode::U, KeyCode::G</autogen>
+          <autogen>--KeyToKey-- KeyCode::I, KeyCode::C</autogen>
+          <autogen>--KeyToKey-- KeyCode::O, KeyCode::R</autogen>
+          <autogen>--KeyToKey-- KeyCode::P, KeyCode::L</autogen>
+          <autogen>--KeyToKey-- KeyCode::BRACKET_LEFT, KeyCode::SLASH</autogen>
+          <autogen>--KeyToKey-- KeyCode::BRACKET_RIGHT, KeyCode::EQUAL</autogen>
+          <autogen>--KeyToKey-- KeyCode::S, KeyCode::O</autogen>
+          <autogen>--KeyToKey-- KeyCode::D, KeyCode::E</autogen>
+          <autogen>--KeyToKey-- KeyCode::F, KeyCode::U</autogen>
+          <autogen>--KeyToKey-- KeyCode::G, KeyCode::I</autogen>
+          <autogen>--KeyToKey-- KeyCode::H, KeyCode::D</autogen>
+          <autogen>--KeyToKey-- KeyCode::J, KeyCode::H</autogen>
+          <autogen>--KeyToKey-- KeyCode::K, KeyCode::T</autogen>
+          <autogen>--KeyToKey-- KeyCode::L, KeyCode::N</autogen>
+          <autogen>--KeyToKey-- KeyCode::SEMICOLON, KeyCode::S</autogen>
+          <autogen>--KeyToKey-- KeyCode::QUOTE, KeyCode::MINUS</autogen>
+          <autogen>--KeyToKey-- KeyCode::Z, KeyCode::SEMICOLON</autogen>
+          <autogen>--KeyToKey-- KeyCode::X, KeyCode::Q</autogen>
+          <autogen>--KeyToKey-- KeyCode::C, KeyCode::J</autogen>
+          <autogen>--KeyToKey-- KeyCode::V, KeyCode::K</autogen>
+          <autogen>--KeyToKey-- KeyCode::B, KeyCode::X</autogen>
+          <autogen>--KeyToKey-- KeyCode::N, KeyCode::B</autogen>
+          <autogen>--KeyToKey-- KeyCode::COMMA, KeyCode::W</autogen>
+          <autogen>--KeyToKey-- KeyCode::DOT, KeyCode::V</autogen>
+          <autogen>--KeyToKey-- KeyCode::SLASH, KeyCode::Z</autogen>
+        </item>
+        <item>
           <name>Use US Keyboard Layout</name>
           <sysctl>remap.layout2us</sysctl>
           <autogen>--SetKeyboardType-- KeyboardType::MACBOOK</autogen>