X の key map を変更する
- note PC のキーボードは嫌いなので、
desktop の様に使う場合は USB の HappyHacking を挿す。
どうせなら英語配列にしたい。
- Ctrl_L キーと CapsLock キーの場所は逆であるべき。
- 変更したキー配列で固定するのは、周りから苦情が来るので宣しくない。
という事情で、複数の 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'