Terminal.app で英数キーを Option キー扱いにする KeyRemap4MacBook パッチ

今まで、MacOSX ではキーボードカスタマイズは一切行わず、郷に入っては郷に従えの精神でやってきました。これは、次のような思惑があったからです。

  • いままで使いやすいと思っていたキーバインディングは「慣れ」が要因であることが多いので、ひょっとしたら OSX ではもっと使いやすいキーバインディングに出会えるかもしれない。
  • OSX のことをよく知らないので、カスタマイズするためにはまず OSX をよく知らなければならない。
  • 「カスタマイズ」をすること自体に手間がかかるので、やらなくていいにこしたことはない。

そんなかんじでかなり色々な操作に慣れたのですが、これだけはどうしてもなんとかしたいと思ったのが以下の点でした。

Terminal.app 以外
「英数」キーを「command」キーにしたい。
Terminal.app 限定で
「英数」キーを「option」キーにしたい。ただし「英数 + TAB」を押した時は「command + TAB」にしたい。
常に
「英数」キーを単独で押した時は「英数」キーとして動作してほしい (SandS のように)。

このようなわがままな要求を一番満たしてくれそうなのが KeyRemap4MacBook でした。KeyRemap4MacBook はソースが公開されておりパッチを当てる手順も詳しく書かれています。

macportsMercurial を入れ、ソースを取得し、パッチを当てる手順と既存のカスタマイズを参考に作成したのが以下のパッチです。このパッチを当てた KeyRemap4MacBook をインストールした上で、システム環境設定パネルで以下の設定をすると意図した動作を実現できます。

  • Remap Tab Key ⇒ Option+Tab to Command+Tab
  • For Japanese ⇒ Remap EISUU Key ⇒ EISUU to Command_L. In Terminal, EISUU to Option_L (+ When you type EISUU only, send EISUU)

(5/20追記)
以下のパッチは本家に取り込んでいただけました

(5/27追記)
バージョン 5.1.0 がリリースされたようです。以下のパッチの内容も含まれています。

diff -r 83fb76d9e849 files/prefpane/checkbox.xml
--- a/files/prefpane/checkbox.xml	Sun May 11 00:30:34 2008 +0900
+++ b/files/prefpane/checkbox.xml	Mon May 19 03:31:42 2008 +0900
@@ -1110,6 +1110,11 @@
               <sysctl>remap.jis_eisuu2commandL_eisuu</sysctl>
             </item>
             <item>
+              <name>EISUU to Command_L. In Terminal, EISUU to OptionL</name>
+              <appendix>(+ When you type EISUU only, send EISUU)</appendix>
+              <sysctl>remap.jis_eisuu2commandL_eisuu_eisuu2optionL_term</sysctl>
+            </item>
+            <item>
               <name>EISUU to Control_L</name>
               <sysctl>remap.jis_eisuu2controlL</sysctl>
             </item>
diff -r 83fb76d9e849 src/core/kext/remap.cpp
--- a/src/core/kext/remap.cpp   Sun May 11 00:30:34 2008 +0900
+++ b/src/core/kext/remap.cpp   Mon May 19 03:31:42 2008 +0900
@@ -1849,6 +1849,22 @@
   }
 
   void
+  remap_jis_eisuu2commandL_eisuu_eisuu2optionL_term(const RemapParams &params)
+  {
+    if (! config.remap_jis_eisuu2commandL_eisuu_eisuu2optionL_term) return;
+
+    FireFunc::FireFunc func = FireFunc::firefunc_jis_eisuu;
+    if ((params.activeApplicationInfo)->is_virtualmachine) func = FireFunc::firefunc_nop;
+
+    static KeyOverlayedModifier kom;
+    if ((params.activeApplicationInfo)->is_terminal) {
+      kom.remap(params, KeyCode::JIS_EISUU, ModifierFlag::OPTION_L, func);
+    } else {
+      kom.remap(params, KeyCode::JIS_EISUU, ModifierFlag::COMMAND_L, func);
+    }
+  }
+
+  void
   remap_jis_eisuu2controlL(const RemapParams &params)
   {
     if (! config.remap_jis_eisuu2controlL) return;
@@ -2514,6 +2530,7 @@
   remap_jis_commandL2commandL_toggle_kana_eisuu(params);
   remap_jis_commandL2controlL_eisuu(params);
   remap_jis_eisuu2commandL_eisuu(params);
+  remap_jis_eisuu2commandL_eisuu_eisuu2optionL_term(params);
   remap_jis_eisuu2controlL_eisuu(params);
   remap_jis_kana2commandR_kana(params);