Bluetooth キーボードのためにまたCapsLockを消し去ったり
今まではcapslock殺しはxmodmapに任せていて、それで不満とかなかった。
しかし、bluetooth キーボードが混沌を運んできた。Amazon二千円で。
接続が切れるたびに(再接続になるたびに)xmodmapされる前の状態に戻る!!!
発狂しかけたので設定方法を調べました。
CapsLock
- CapsLockをCtrlにするまとめ (Λlisue's blog)
- Remap Caps Lock
- 日本語キーボードを英語配列風にする (@tmtms のメモ)
- xmodmap and bluetooth keyboard (maemo.org)
xkbで設定しろよ。ってことがわかった。
それでこれをどこで設定するかという話になるのだけれど、色々なところで書けるみたいでどれが一番スマートか分かりかねました。
capslockを殺すだけなら
/usr/share/X11/xorg.conf.d/10-evdev.conf
なりのevdevの設定で
Section "InputClass" Identifier "evdev keyboard catchall" MatchIsKeyboard "on" MatchDevicePath "/dev/input/event*" Driver "evdev" Option "XkbLayout" "us" Option "XkbOptions" "ctrl:nocaps" EndSection
するのが手っ取り早そう。
ついでにリマッピング
最近出回っているbluetoothキーボードは、Escがなかったりしますので更にリマップしたくなるでしょう。私の場合は、EscがXF86HomePageとかが割り当たってたのでリマップします。私の場合、どうせ使わないので潰す方向でいきます。
Debian 6 squeeze のキーマップ設定 (One Foot) でxkbの適用順番が解説されています。
まず、xevでキーコードを調べる。xevでキーコードが取れない場合はHow to get keycodes for xmodmap?を見るとよろしい。
KeyRelease event, serial 32, synthetic NO, window 0x1a00001, root 0x9d, subw 0x0, time 1509250, (-532,286), root:(623,829), state 0x0, keycode 180 (keysym 0xff1b, XF86HomePage), same_screen YES, XKeysymToKeycode returns keycode: 9 XLookupString gives 1 bytes: (1b) "" XFilterEvent returns: False
keycode 180
次に、setxkbmap -print -v
して適応されているルールを調べる。
keycodes: evdev+aliases(qwerty) types: complete compat: complete symbols: pc+us+inet(evdev)+ctrl(nocaps) geometry: pc(pc104) xkb_keymap { xkb_keycodes { include "evdev+aliases(qwerty)" }; xkb_types { include "complete" }; xkb_compat { include "complete" }; xkb_symbols { include "pc+us+inet(evdev)+ctrl(nocaps)" }; xkb_geometry { include "pc(pc104)" }; };
X11/xkb/keycodes/evdev
X11/xkb/keycodes/aliases
のqwertyセクション
の順で適用さている。
キーコード180は、X11/xkb/keycodes/evdev
で
<I180> = 180; // #define KEY_HOMEPAGE 172
<I180>に割り当てられているので、今度は<I180>を追う。(ちなみにここで、<ESC> = 180
とすると、元々のEscapeキーであるkeycode 9がどこにも割り当てられてない状態になってしまう。)
今度は、X11/xkb/symbols/
以下で<I180>が適応されている部分を探す。
さっきのsetxkbmap -print -v
をみてみる。
X11/xkb/symbols/pc
X11/xkb/symbols/us
X11/xkb/symbols/inet
のevdevセクションX11/xorg.conf.d/10-evdev.conf
で指定したctrl:nocpas
の順で適用さているのがわかる。ここで- 日本語キーボードを英語配列風にする (@tmtms のメモ)の方法でリマップしても<I180>はX11/xkb/symbols/inet
で割り当てられているのでダメダ。
考えられた方法は、
X11/xkb/symbols/inet
を呼び出さないようにルールを書き換える。そうすれば、もカスタマイズしたように動くので、そのカスタマイズしたsymbolsを X11/xorg.conf.d/10-evdev
のXkbLayoutで指定する。X11/xkb/symbols/inet
を直接書き換える。
1番の場合、どのルールが適用されているか調べる必要があるのだけれど、私のX は、--with_default_xkb_rules=evdev を指定してビルドされてるので、X11/xkb/rules/evdev
を書き換えればいい。…のだけれどあんまり書き換えたくない。
2番の場合、…もあんまり書き換えたくない。
…結局は、2番で。うーん。
あとはxkbの設定についてArch Wiki とか見ればいいのだと思う。 X KeyBoard extension(Arch Wiki)
理想としては再接続かかるたびにxmodmap走らせたいよねー。ユーザーごとに設定したいよねー。xmodmapは指定の仕方によってはトグル操作になって嬉しくないのかも知れないけど、キーコードに直接割り当てるだけなら大丈夫そう。これはまたそのうちできたらできたで…。
その方法がわかるまでにストレスで死にそうなので、今はこうしてるってメモでした。 もっといい方法知りたい。