rxvt + emacs -nw な環境で SuperKey を使う
早く SuperKey のシーケンス定義してくれと思いながら、以下のように無理矢理に SuperKey を認識させるようにしてみました。なお、おそらく rxvt 以外のターミナルでも同じことができると思います。
~/.Xdefaults:
URxvt.keysym.Super_L: \030@s URxvt.keysym.Super_R: \030@s
Emacs は C-x @ s (つまり <CAN> @ s )を super と認識してくれるのでそれを利用しています。これで、
(global-set-key [(super b)] 'iswitchb-buffer)
とやって、 SuperKey + b を押すと iswitchb-buffer が起動します。 C-c 以上に s はキーバインドが空いているので、好きなだけわりあてることができます。すばらしいですね!
ただ、一つ問題があります。例えば、 Alt_Down A_Press B_Press Alt_Up というキーシーケンスを送出した場合、そのシーケンスを Alt + A の次に Alt + B が押されたと認識しますが、上の設定を使って、 Super_Down A_Press B_Press Super_Up というシーケンスを送出すると、 Super + A の次に B が押されたと認識されてしまいます。これは rxvt が SuperKey を prefix として認識してないのが原因なのですが、残念ながら keysym に prefix であることを指定するような構文がないので、自分で rxvt のソースコードをいじるしかありません。慣れれば問題ないと思うので僕はとりあえずこれで満足することにしました。
蛇足ですが、
% man ascii
で ASCII コード表が見れるの知ってました?
追記
rxvt-unicode のソース読んでたらわりと簡単にハックできそうなのでやってみました。
superkey-hack.patch:
--- src/command.C.orig  2007-05-06 13:29:58.000000000 +0900
+++ src/command.C       2007-05-06 13:27:58.000000000 +0900
@@ -303,7 +303,7 @@
 void
 rxvt_term::key_press (XKeyEvent &ev)
 {
-  int ctrl, meta, shft, len;
+  int ctrl, meta, shft, super, len;
   unsigned int newlen;
   KeySym keysym;
   int valid_keysym;
@@ -323,6 +323,7 @@
   shft = ev.state & ShiftMask;
   ctrl = ev.state & ControlMask;
   meta = ev.state & ModMetaMask;
+  super = ev.state & Mod4Mask;
 
   if (numlock_state || (ev.state & ModNumLockMask))
     {
@@ -911,6 +912,11 @@
       tt_write (&ch, 1);
     }
 
+  if (super) {
+    char buf[3] = { 0x18, '@', 's' };
+    tt_write (buf, 3);
+  }
+
   tt_write (kbuf, (unsigned int)len);
 }
これで SuperKey が <CAN> @ s という prefix として送出されます。
- The URL to Trackback this entry is:
 - http://dev.ariel-networks.com/Members/matsuyama/superkey-on-rxvt-emacs/tbping