ページ

2012年4月12日木曜日

Debian squeeze キーバインドの変更

キーボードに Happy Hacking Lite を使っているのですが、Emacs を使う時に Meta にあたる Esc キーや ALT キーの位置がどうも使いづらいので、Space キーのすぐ左にある 無変換 キーを Meta に変更しました。

xmodmap でやればコマンド一発だし簡単、でもいいですが、無変換 キーは普段使用しないので、キーマップ自体を変更しています。

Keycode <--> Keysym のマッピングを変更して、無変換 キーの Keycode に対して、Meta の Keysym を返すようにするということですね。

まず、 自分の環境で 無変換 キーがどの Keycode になっているのかを xev コマンドで確認します。
KeyRelease event, serial 34, synthetic NO, window 0x1000001,
    root 0x101, subw 0x0, time 89541208, (-103,502), root:(640,520),
    state 0x0, keycode 102 (keysym 0xff22, Muhenkan), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False
Keycode は 102 であることが分かります。

Debian 6 squeeze のキーマップ設定 で書きましたが、私の環境では Keycode に関するテンプレートは、
  •  keycodes :  evdev+aliases(qwerty)
ですので、/usr/share/X11/xkb/keycodes/evdev を見ると、Keycode 102 <MUHE> キーが割り当てられています。
default xkb_keycodes "evdev" {
         ・
         ・
        // Keys that are generated on Japanese keyboards

        //<HZTG> =  93; // Hankaku/Zenkakau toggle - not actually used
        alias <HZTG> = <TLDE>;
        <HKTG> = 101;   // Hiragana/Katakana toggle
        <AB11> = 97;    // backslash/underscore
        <HENK> = 100;   // Henkan
        <MUHE> = 102;   // Muhenkan
        <AE13> = 132;   // Yen
        <KATA> =  98;   // Katakana
        <HIRA> =  99;   // Hiragana
        <JPCM> = 103;   // KPJPComma
        //<RO>   =  97; // Romaji
};

次に Keysym に関するテンプレートは以下になっていますので、
  •  symbols :  pc+jp+inet(evdev)
<MUHE> キーの Keysym は、/usr/share/X11/xkb/symbols/inetevdev セクションを見ると Muhenkan に割り当てられています。
これを Meta_L に変更します。
xkb_symbols "evdev" {
     ・
     ・
    key <HKTG>   {      [ Hiragana_Katakana     ]       };
    key <HENK>   {      [ Henkan                ]       };
    //key <MUHE>   {      [ Muhenkan              ]       };
    key <MUHE>   {      [ Meta_L              ]       };
     ・
};

最後に Xserver を再起動して、xev コマンドで Keycode 102 の Keysym が Meta_L になっていることを確認します。
KeyPress event, serial 34, synthetic NO, window 0x1a00001,
    root 0x101, subw 0x0, time 88590427, (549,-233), root:(550,622),
    state 0x0, keycode 102 (keysym 0xffe7, Meta_L), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

2012年4月2日月曜日

Debian 6 squeeze のキーマップ設定

キーボードのキーを自分好みにカスタマイズしたいことはよくありますが、そもそもシステムでどのように設定されているのか気になると思います。
 
X では XKB を使用してキーマップの設定が行われます。
squeeze においては Xserver 起動時に /etc/default/keyboard の設定内容から、XKB のオプションである XkbModel、XkbLayout、XkbVariant、XkbOptions が設定され、XkbRules で指定されたルールに基づいてキーマップが決定されます。 

私の環境では /etc/default/keyboard は以下のようになっていました。
XKBMODEL="pc105"
XKBLAYOUT="jp"
XKBVARIANT=""
XKBOPTIONS=""
XkbRules はどのように決まるのかというと、squeeze の X は、--with_default_xkb_rules=evdev を指定してビルドされているので、デフォルトで XkbRules は evdev となり、ルールファイル /usr/share/X11/xkb/rules/evdev が適用されるようになります。

/var/log/Xorg.0.log を見るとどれが適用されたのか分かります。
(II) XINPUT: Adding extended input device "AT Translated Set 2 keyboard" (type: KEYBOARD)
(**) Option "xkb_rules" "evdev"
(**) Option "xkb_model" "pc105"
(**) Option "xkb_layout" "jp"
ルールファイルには、XKB のオプション設定に応じて、どのテンプレートを適用するかが書かれています。

/usr/share/X11/xkb/rules/evdev を見ていくと、XkbModel = pc105、XkbLayout = jp の場合は、キーマップの各パラメータは以下のように決まることがわかります。
  • keycodes :  evdev+aliases(qwerty)
  • symbols :  pc+jp+inet(evdev)
  • geometry :  pc(pc105)
  • compat :  complete+japan
  • types :  complete
この設定は setxkbmap -print -v コマンドで確認できます。
Trying to build keymap using the following components:
keycodes:   evdev+aliases(qwerty)
types:      complete
compat:     complete+japan
symbols:    pc+jp+inet(evdev)
geometry:   pc(pc105)
xkb_keymap {
        xkb_keycodes  { include "evdev+aliases(qwerty)" };
        xkb_types     { include "complete"      };
        xkb_compat    { include "complete+japan"        };
        xkb_symbols   { include "pc+jp+inet(evdev)"     };
        xkb_geometry  { include "pc(pc105)"     };
};
Keycode は evdev+aliases(qwerty) なので、以下のファイルが適用されることになります。
  1. /usr/share/X11/xkb/keycodes/evdev
  2. /usr/share/X11/xkb/keycodes/alias の qwerty セクション
 また、Keysym は pc+jp+inet(evdev) なので、以下のファイルが適用されることになります。
  1. /usr/share/X11/xkb/symbols/pc
  2. /usr/share/X11/xkb/symbols/jp
  3. /usr/share/X11/xkb/symbols/inet の evdev セクション
※重複する項目は、後のファイルが適用されます。


Xserver はキーボードで押されたキーの Keycode に対応する Keysym を、Xclient に渡す仕組みになっていますので、この Keycode <-> Keysym の変換に手を加えると、自分好みのキーにできるわけです。