X の key map を変更する


という事情で、複数の key map をユーザーレベルで切り替えられる様にした。

xmodmap での設定について

キーボード上の個々のキーには keycode と呼ばれる番号が付いており、 この番号は hardware に対して振られているもので変更できない。 例えば a と印字されているキーには keycode 38 が振られていて、 X で keycode 38 は keysymbol a に対応付けられているので a が入力された事になる。 xmodmap による key map の変更は、 keycode と keysymbol の対応を変更する事によって行う。 又、他のキーの動作を変えるキーは扱いが違っており、 keysymbol を modifier map に登録しておく必要が有る。 例えば、二つの shift キーが shift の機能を持っているのは、 keysymbol 名に Shift と付いているからではなく、 両者が shift という modifier map に登録してあるからである。 keycode と keysymbol の対応付けや modifier map の変更を xmodmap の書式に従ってファイルに記入し、
$ xmodmap filename
を実行すれば設定が反映される。 各キーの keycode や現在対応している keysymbol を調べるには xev コマンドを使えば良い。

設定手順

日本語配列と英語配列の切り替え

setxkbmap コマンドを使う。 日本語配列へは、
setxkbmap -rules xfree86 -model jp106 -layout jp
英語配列へは、
setxkbmap -rules xfree86 -model us -layout us
で切り替えが可能。 (xmodmap -pke を使う必要は無い、、、)

旧情報 (無駄な手間がかかるだけの方法)

xmodmap -pke を実行すると現在のキー配列が xmodmap の書式で出力されるので、 先ずはこれを用いて素の日本語配列と英語配列のリストを得る。 /etc/X11/XF86Config-4 を書き換えるか別の PC を用いるかして X 自体のキー配列を変え、 日本語配列の状態で xmodmap -pke >~/.xmodmap.jp、 英語配列の状態で xmodmap -pke >~/.xmodmap.us を実行すれば良い。

xmodmap -pke の出力には全てのキー配列が再現されているはずなのだが、 以前試した時は modifier key と同時押しした時の keysymbol が正しく設定されていなかった。 例えば keycode 67 = F1 XF86_Switch_VT_1 であるべきが keycode 67 = F1 だけになり、 この状態では Ctrl+Alt+F1 で仮想コンソールに移れない。 F1 キーはキー配列に依らないので、 両方のファイルから対応する行を削除する事で対処した。

Ctrl_L と CapsLock の交換

以下の内容で ~/.xmodmap.mod を作る。
!! Caps_Lock と Control_L の入れ換え
remove Lock = Caps_Lock
remove Control = Control_L
keysym Control_L = Caps_Lock
keysym Caps_Lock = Control_L
add Lock = Caps_Lock
add Control = Control_L

!! 半角/全角キーを Escape に変更
keycode  49 = Escape
両方のキーを modifer map から削除し、 keysymbol を入れ換えてから再び登録するという手順を踏んでいる。 keysym 行の左辺の keysymbol 名は現在の keycode に変換される。 ついでに半角/全角キーを Escape に変更しておく。

Bash alias の作成

コマンド一つで切り替えられる様にしておく。
~/.bashrc に追記
alias setxkbmap-jp='setxkbmap -rules xfree86 -model jp106 -layout jp'
alias setxkbmap-modjp='setxkbmap -rules xfree86 -model jp106 -layout jp; xmodmap ~/.xmodmap.mod'
alias setxkbmap-us='setxkbmap -rules xfree86 -model us -layout us'