Xorg のキーマップをカスタマイズしようと思う
きっかけとゴール
私はデスクトップ PC でサンワサプライの SKB-SL18BKN というキーボードを使用しています。また、それとは別にヒューレット・パッカードの SPECTRE 13-af520TU というノート PC も所有しています。はじめのうちは気がつかなかったんですが、両者のキーボードには重大な (?) 相違があるんですね…。それぞれのキーボードの左下を見てください (図 1)。そう!SPECTRE のキーボードには「無変換」キーがないんです1)。awesome というウィンドウマネージャの紹介記事で Mod4 修飾キーについて触れました。当初、思いつきで 無変換キーに Mod4 を割り当てたのですが、SPECTRE のキーボードではそれが不可能であることに気がつき、できるだけ両者に共通のキー配列にしたいと考えたのがことの次第です。
もう一点、これも同記事で触れましたが、Xorg のデフォルトでは Mod4 キーはたいてい Windows キーが割り当てられており、このことが VMware で FreeBSD をゲスト OS として使う場合に問題となります。ホスト OS である Windows のショートカットキーとかち合ってしまうのです。例えば、awesome のマスターウィンドウの幅を広げるつもりで「Mod4 + l」を押すとWindows 側でログアウトが発生します。という訳で VMware 上での使用も考慮に入れます。
さらにもう一点、重要な動機があります。「CapsLock と 左 Ctrl の入れ替え」です (メジャーすぎる話題ですが…)。
- SPECTRE 13-af520TU はカラーが「アッシュブラック」「セラミックホワイト」の 2 種類あり、なぜか「アッシュブラック」のモデルだけが英語キーボード仕様のため無変換キーがないのです。
以上をまとめて、日本語キーボード、英語キーボードそれぞれ下記のように変更しようと思います (図 2)。
- 日/英共通設定
- CapsLock キーを Control とする
- 左 Ctrl キーを Mod4 とする
- 日本語キーボード向け設定
- 無変換キーを Mod1 (Alt) とする
- 変換キーを Mod1 (Alt) とする
- カタカナ/ひらがなキーを Mod4 とする
- アプリケーションキーを Mod4 とする
- 英語キーボード向け設定
- 右 Ctrl キーを Mod4 とする
ちなみに「アプリケーションキー」とは、図 1 でいうところのカタカナ/ひらがなキーと左矢印キーの間にあるキーのことらしいです。
なお、「日本語キーボード」「英語キーボード」といっても広範であり、本記事の内容がそのまま別のケースに適用できるとは限りません。そこで本記事では「日本語キーボード」といったらサンワサプライの SKB-SL18BKN を、「英語キーボード」といったらヒューレット・パッカード SPECTRE 13-af520TU の英語キーボードを指すものとします。
キーコードとキーシム
キーコード: | キーボード上の物理的なキーの各々に対して振られる番号。環境によって異なる番号になることもある。 |
キーシム: | キーコードに割り当てられている値。キャラクタコード表に対応している (キャラクタコード表についてはググってください)。 |
% xev | grep keycode
state 0x0, keycode 38 (keysym 0x61, a), same_screen YES,
state 0x0, keycode 38 (keysym 0x61, a), same_screen YES,
修飾キー (モディファイアキー)
% xmodmap -pm
xmodmap: up to 4 keys per modifier, (keycodes in parentheses):
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x42)
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x40), Alt_R (0x6c), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3
mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
設定ファイルを準備する
usermodmap=$HOME/.Xmodmap
...
if [ -f "$usermodmap" ]; then
xmodmap "$usermodmap"
fi
remove MODIFIERNAME = KEYSYMNAME ...
KEYSYMNAME で指定されたキーシムを、MODIFIERNAME で指定されたモディファイヤマップから削除する。
clear MODIFIERNAME
MODIFIERNAME で指定されたモディファイヤマップに登録されているすべてのキーシムを削除する。
keycode NUMBER = KEYSYMNAME ...
NUMBER で指定されたキーコードに KEYSYMNAME で指定されたキーシムを割り当てる。
add MODIFIERNAME = KEYSYMNAME ...
MODIFIERNAME で指定されたモディファイヤマップに KEYSYMNAME で指定されたキーシムを登録する。
日本語キーボードの場合
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x42)
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x40), Alt_R (0x6c), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3
mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
remove lock = Caps_Lock
remove control = Control_L
keycode 66 = Control_L
keycode 37 = Super_L
keycode 101 = Super_R
keycode 102 = Alt_L
keycode 100 = Alt_R
keycode 135 = Super_R
add control = Control_L
add mod1 = Alt_L Alt_R
add mod4 = Super_L Super_R
shift Shift_L (0x32), Shift_R (0x3e)
lock
control Control_L (0x42), Control_R (0x69)
mod1 Alt_L (0x40), Alt_R (0x64), Alt_L (0x66), Alt_R (0x6c), Alt_L (0xcc), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3
mod4 Super_L (0x25), Super_R (0x65), Super_L (0x85), Super_R (0x86), Super_R (0x87), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
VMware における日本語キーボードの場合
VMware への FreeBSD の導入については別記事を参照してください。
前提として、ホスト OS である Windows 側では、レジストリ設定により CapsLock キーと左 Ctrl キーを交換済みであるとします。その具体的な方法についてはググっていただきたいのですが、ざっくり説明すると、次のようなテキストファイルを書いて「SwapCapsCtrl.reg」とか何とか適当に名前をつけて保存し、ダブルクリックすることでレジストリに反映させます。レジストリをいじることになるので、やっていることを理解の上、自己責任で行ってください。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,\
03,00,00,00,3a,00,1d,00,\
1d,00,3a,00,00,00,00,00
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x42)
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x40), Alt_R (0x6c), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3
mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
remove lock = Caps_Lock
keycode 66 = Super_L
keycode 101 = Super_R
keycode 102 = Alt_L
keycode 100 = Alt_R
keycode 147 = Super_R
add mod1 = Alt_L Alt_R
add mod4 = Super_L Super_R
shift Shift_L (0x32), Shift_R (0x3e)
lock
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x40), Alt_R (0x64), Alt_L (0x66), Alt_R (0x6c), Alt_L (0xcc), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3
mod4 Super_L (0x42), Super_R (0x65), Super_L (0x85), Super_R (0x86), Super_R (0x93), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
英語キーボードの場合
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x42)
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x40), Alt_R (0x6c), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3
mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
remove lock = Caps_Lock
clear control
keycode 66 = Control_L
keycode 37 = Super_L
keycode 105 = Super_R
add control = Control_L
add mod4 = Super_L Super_R
shift Shift_L (0x32), Shift_R (0x3e)
lock
control Control_L (0x42)
mod1 Alt_L (0x40), Alt_R (0x6c), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3
mod4 Super_L (0x25), Super_R (0x69), Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
Xorg のキーマップを三つのケースに分けて検討しました。そもそも日本語キーボードと英語キーボードを両方使っている人がどれくらいいるんだろう?とか awesome を使う人じゃないと Mod4 なんか使わないよなーとか考え出すと、大して需要もなさそうな記事に随分労力をつぎ込んだものです。でも何かしらご参考になれば幸いでございます。