Personal tools
You are here: Home ブログ matsuyama rxvt + emacs -nw な環境で SuperKey を使う
Document Actions

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 として送出されます。

Category(s)
linux
emacs
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/matsuyama/superkey-on-rxvt-emacs/tbping
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.