8月 192013
 

以前のエントリで「ibus-mozc を使う。」というのを書いているのですが、このときは mozc を ibus 経由で利用します。と、いうネタが基本でしたが「僕はかな入力の人なので、かな入力時の “ー” 問題ががあります。」と書いています。

その時は xmodmap で以下の設定を行うことにより回避していました。詳細についてはリンク先のエントリを読んでみてください。

keycode 133 = bar bar bar bar

 
しかし、最近の ports-current を利用していて、とあるタイミングから USB キーボードを抜き差しすると上記 xmodmap の設定がチャラになって(消えて)しまう事象に悩んでいたのであります。

色々調べてみると xorg.conf の設定で hal を利用していた場合に原因があることが解ってきました。以下に事象を箇条書きにしてみます。

o. USB キーボード利用時に(USB KVM などで)キーボードの抜き差しを行なったあとに利用すると xmodmap の設定が消えている
o. USB キーボードを X が hal 経由で認識しているときにその問題が発生する
o. hal はどうやら setxkbmap を利用して xmodmap の設定を飛ばしてしまうようだ
o. USB キーボードを認識したところで xmodmap を実行すると再度キーバインドが有効になる

と、いうような状況。

そもそも mozc をかな入力で利用していない人にとっては “\” (バックスラッシュ)を “|” (バー)に割り当てる必要は全く無いわけでして、なのでこの問題に遭遇することは無いと思われます。

 
と、いうことで、ここからはどうしてもキーバインドを変更したい人にとっては重要な内容になるのであります。
そして、ある程度原因が特定できたので、ここから先は xmodmap と setxkbmap の対比について見ていくことにしましょう。

上記 xmodmap の設定において “\” の keycode は 133 です。これは xev(1) でキーを調べたり xmodmap -pke コマンドで、現在 133 に何が割り当てられているか確認すれば良いので比較的容易に調べられます。まぁ、昔からある枯れた確認方法ですしね。

それにしても xmodmap で指定した設定が setxkbmap のどれに対応するのか解らない。 hal を利用していて Ctrl と CAPS Lock を入れ替える場合には以下の設定を /usr/local/etc/hal/fdi/policy/10-keyboard-jp106.fdi 辺りによく書いています。

<merge key="input.x11_options.XkbOptions" type="string"> ctrl:nocaps</merge>

 
で、 setxkbmap もこの形式を引きずっているようで、オプションパラメータが合えば受け付けるんでないかなぁ。

$ setxkbmap -option bar:nobackslash

 
上記コマンドのオプションの法則をまるて理解してなくて実行しているんですが、これでは backslash が bar に置き換わりませんでした。もーしょうがないので色々調べることにします。

xmodmap は xev で値を確認したり -pke オプションで表示された情報に従って動作していることが解ります。なのに setxkbmap ってどうやって設定するのぉ?って。調べていくと /usr/local/share/X11/xkb/ 内のファイルを各種参照していることが解ってきました。でもって以下のコマンドで参照しているファイルが確認できそうです。

$ setxkbmap -print
xkb_keymap {
        xkb_keycodes  { include "xfree86+aliases(qwerty)"       };
        xkb_types     { include "complete"      };
        xkb_compat    { include "complete+japan"        };
        xkb_symbols   { include "pc+jp" };
        xkb_geometry  { include "pc(pc104)"     };
};

 
上記の結果で確認する必要があるのが xkb_keycodes と xkb_symbols です。

xkb_keycodes は xfree86 だね。ってことはファイル的には /usr/local/share/X11/xkb/keycodes/xfree86 になります。 xmodmap では keycode の 133 の値を変更したかったので 133 で grep してみるとっ!! おーーっ!! <AE13> = 133; って行が見つかりました。

でもって xkb_symbols を見るとと今度はファイル的には /usr/local/share/X11/xkb/symbols/jp を参照していると思われます。

なるほどー。これで xmodmap と setxkbmap との関連性がそこはかとなく解ってきたような気がします。
しかし、それにしても setxkbmap -option に指定する記述方法がいまいち解りません。しょうがないので直接設定ファイルを変更してしまうことにしましょう。

あ。ちなみに setxkbmap -option に指定した形式は 上記 hal の 10-keyboard-jp106.fdi に input.x11_options.XkbOptions に設定してあげるだけで良いみたいなんですけどね。形式が解れば直接設定ファイルを変更する必要は無いんですけども。

と、いうことで /usr/local/share/X11/xkb/symbols/jp のファイルを以下のように変更してあげます。変更する項目は先程確認して <AE13> だということが解っていますね。

//  key <AE13> { [ backslash, bar       ] };
    key <AE13> { [ bar, bar   ] };
        :
//  key <AE13> { [ backslash, bar       ] };
    key <AE13> { [ bar, bar   ] };

 

<AE13> の項目は全部で二つあったので両方とも直しました。あとはマシンを再起動して X が起動したあとにログインして USB キーボードを抜き差しして動作確認を行い xmodmap で指定していた値が変わらなくなったことを確認します。

 
今回はたまたま mozc のかな入力のキーバインド変更のための設定変更でしたが、通常 CAPS Lock と Ctrl キーの変更などはウェブ上にゴロゴロしていますよね。そーじゃないちょっと変わったキーの変更を hal 経由の場合に継続的に持続する場合についての探し方などについてまとめてみました。

多分、他のキーについても上記の方法で行けるのでは無いかと思われます。

それにしても setxkbmap -option の記述方法知りたいなぁ。オプションに指定する方法などを知っている方いましたら教えて頂ければと思います;-)。