Ubuntuにおけるキーボードレイアウトカスタマイズ : xmodmap問題をxkbで解決

  • 7
    Like
  • 0
    Comment

対象

  • Linux(Ubuntu)でキーマップを変更したい

  • xmodmapがちゃんと動かないんだけど?」

というビギナーさん向けです. xkbについての詳しい解説は載せていません. 環境は Ubuntu 16.04 LTS を想定しています.

あらまし

かつては, Linuxでキーボードレイアウトをカスタムしたいときはxmodmapを使うのがふつうでした. xevでキーコードを調べて, ホーム直下にある.Xmodmap

keycode 51 = Return

とでも書き込んでシェルでxmodmap .Xmodmapと打ち込んであげれば, 51番のキーコードを持つキーがReturn(Enter)キーになってくれるのです. この方法の解説はネットにたくさんあります.

しかし最近のUbuntuではこの方法が有効ではなくなってしまいました. 設定した直後はちゃんと動くものの, しばらくすると元のキーマップに戻ってしまいます1.

最近のUbuntuではキーボードレイアウトの変更はxkbというものを使うことが推奨されているようです. さて, このxkbなるものの使い方はxmodmapとどのように異なるのでしょうか?

個人的な動機

(読み飛ばしてもらって頂いても結構です)

最近HHKBの英字配列を自宅用に買いました. すこぶる快適です. これを受けて, 研究室にある日本語配列のキーボード(Libertouch)を英字配列に変えたくなりました. 「システム設定」→「テキスト入力」にて入力ソースの「日本語」を「英語(US)」に変えればいいだろう, と思いました. だいたいOKでした.

しかし, 下の青いキーは思ったとおりに動作しませんでした.

key1.gif
富士通コンポーネントさんより

右シフトのとなりはまあどうでもいいのですが, Backspaceのとなりは「\(backslash), |(bar)」になってほしいです. ちなみにHHKBの配列はこんなかんじです:

key2.gif
PFUさんより

しかし残念なことに, 英字配列のキーは日本語配列よりも少ないので上の2つのキーコードが存在しません. xmodmapでは辛うじて設定できたのですが, 前述の通り何者かによってキーマップが上書きされてしまいます. というわけで, キーコードが存在しないならしょうがない. 「システムの日本語配列の設定をUS配列と同等のものに置き換えてしまおう」と考えました2. 調べるとxkbなるものを使えばよいことがわかりました. というわけで, 本題です.

手順

繰り返しになりますが, xmodmapでは

  • xevでキーコードの取得
  • .Xmodmapに設定を書き込み

という手順を踏むことになります. ではxkbではどのようにしてキーコードを取得すればよいのでしょうか? まずはシェルでsetxkbmap -printと入力してみましょう:

xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+jp"};
    xkb_geometry  { include "pc(pc105)" };
};

こんなのが出てきました. 注目すべきはxkb_symbolsのところです. pc+jppcjpというファイルを読み込むことを意味しています. つまりこのpcjpが設定ファイルに相当するのです. もし英字配列に設定している方はjpusになっているでしょう. ではこの設定ファイルはどこにあるのでしょうか. 自分の環境では/usr/share/X11/xkb/symbols/内にありました. では, 試しにjp内を覗いてみましょう:

key3.png
とある理由によりバッファ名は_jpになってます

もうなんとなくわかりましたね, たとえば「1, !」のキーコードは<AE01>, 「e, E」のキーコードは<AD03>です. これでめでたくxkbにおけるキーコードを調べることができました. しかし, キーコード自体はそんなに重要ではありません. なぜかというと, キーマップを変更するにはこの設定ファイルをそのまま書き換えてしまえばよいからです3. どこをどう変更するかは設定ファイルを眺めていればだいたいわかると思います. 自分はUS配列ぽくしたいのでこんなかんじにしました:

key4.png

(自分にとって)大事なことは英字配列の設定ファイルusには存在しない<AE13>のキーコードが日本語配列の設定ファイルjpにはちゃんとあることです. これで上の青いキーを英字配列っぽくマップすることができました.

まとめ

  1. setxkbmap -printxkb_symbolsを見て, どの設定ファイルが読み込まれているのかを確認(普通の日本語配列ならjp)
  2. /usr/share/X11/xkb/symbols/内のお目当ての設定ファイルを見つける
  3. お好きに書き換えましょう
  4. 再ログイン

挙動がおかしくなってもすぐに元に戻せるようにバックアップを取っておきましょう. 自分はjpのバックアップを_jpとしました.

常識的に考えれば, /usr/share/X11/...なんてところにあるファイルを直接書き換えることはかなりの暴挙であるように思います4. 可搬性も悪いです. xmodmapにおける.Xmodmapみたいな間接的な設定ファイルを作ることはできるのかな? 何にしても場当たり的であることは間違いないので, もっとクレバーな方法を知っているクレバーな方に是非教えていただきたいです.


  1. 一説によるとFcitxがxmodmapが変更したキーマップを上書きしてしまうらしいです.  

  2. 絶対にもっと上手い方法があるはず... 

  3. いや絶対にもっと上手い方法があるはず... 

  4. いやいや絶対にもっと上手い方法があるはず...