対象
-
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でした.
しかし, 下の青いキーは思ったとおりに動作しませんでした.
右シフトのとなりはまあどうでもいいのですが, Backspaceのとなりは「\(backslash), |(bar)」になってほしいです. ちなみにHHKBの配列はこんなかんじです:
しかし残念なことに, 英字配列のキーは日本語配列よりも少ないので上の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+jp
はpc
とjp
というファイルを読み込むことを意味しています. つまりこのpc
やjp
が設定ファイルに相当するのです. もし英字配列に設定している方はjp
がus
になっているでしょう. ではこの設定ファイルはどこにあるのでしょうか. 自分の環境では/usr/share/X11/xkb/symbols/
内にありました. では, 試しにjp
内を覗いてみましょう:
もうなんとなくわかりましたね, たとえば「1, !」のキーコードは<AE01>, 「e, E」のキーコードは<AD03>です. これでめでたくxkb
におけるキーコードを調べることができました. しかし, キーコード自体はそんなに重要ではありません. なぜかというと, キーマップを変更するにはこの設定ファイルをそのまま書き換えてしまえばよいからです3. どこをどう変更するかは設定ファイルを眺めていればだいたいわかると思います. 自分はUS配列ぽくしたいのでこんなかんじにしました:
(自分にとって)大事なことは英字配列の設定ファイルus
には存在しない<AE13>のキーコードが日本語配列の設定ファイルjp
にはちゃんとあることです. これで上の青いキーを英字配列っぽくマップすることができました.
まとめ
-
setxkbmap -print
のxkb_symbols
を見て, どの設定ファイルが読み込まれているのかを確認(普通の日本語配列ならjp
)
-
/usr/share/X11/xkb/symbols/
内のお目当ての設定ファイルを見つける - お好きに書き換えましょう
- 再ログイン
挙動がおかしくなってもすぐに元に戻せるようにバックアップを取っておきましょう. 自分はjp
のバックアップを_jp
としました.
常識的に考えれば, /usr/share/X11/...
なんてところにあるファイルを直接書き換えることはかなりの暴挙であるように思います4. 可搬性も悪いです. xmodmap
における.Xmodmap
みたいな間接的な設定ファイルを作ることはできるのかな? 何にしても場当たり的であることは間違いないので, もっとクレバーな方法を知っているクレバーな方に是非教えていただきたいです.