キーボード割当を変更して ctrl キーとcapsキーを入れ替える方法です
udev で設定するので,hotplug 対応,コンソール&Xサーバ同時に設定可能な方法となります.
要約
キーボードをUSBで接続している場合
lsusb で vendorID と productID を調べます
$ lsusb
たとえば以下の出力の場合は
Bus 001 Device 002: ID 0853:013f Topre Corporation REALFORCE 108JP
- venderIDは0853
- productIDは013f
ということがわかります
設定ファイル/etc/udev/hwdb.d/90-keyboard.hwdb で以下の設定を行います
evdev:input:b*v0853p013F* KEYBOARD_KEY_70039=leftctrl KEYBOARD_KEY_700e0=capslock
先頭のevdev:input: の行が重要です
キーボードのIDの書式は
b*v<venderID>p<productID>*
です.ポイントは
- IDは4桁の16進数で指定
- ABCDEDは大文字で指定
する点です.
013f では駄目で,013Fと指定する必要があります
設定は反映させるには
$ sudo udevadm hwdb --update
$ sudo udevadm trigger
これでctrlキーとcapsキーが入れ替わります.
さらに,設定ファイルを
evdev:input:b*v0853p013F* KEYBOARD_KEY_70035=esc KEYBOARD_KEY_70029=grave KEYBOARD_KEY_70039=leftctrl KEYBOARD_KEY_700e0=capslock
と変更すると
- ESCキーと全角半角キー(grave)を入れ替える *1
- caps lockキーと ctrlキーを入れ替える
となります
詳細説明
以下,上記設定ファイルを作るまでの手順を説明します
スキャンコード(キーコード)を調べる
$ cd /dev/input/by-id $ ls -la
を実行します
手元の環境では
lrwxrwxrwx 1 root root 9 Sep 21 12:23 usb-SteelSeries_SteelSeries_Rival_310_eSports_Mouse-if01-mouse -> ../mouse0 lrwxrwxrwx 1 root root 9 Sep 21 12:23 usb-SteelSeries_SteelSeries_Rival_310_eSports_Mouse-if02-event-kbd -> ../event4 lrwxrwxrwx 1 root root 9 Sep 21 12:23 usb-Topre_REALFORCE_108JP-event-if01 -> ../event1 lrwxrwxrwx 1 root root 9 Sep 21 12:23 usb-Topre_REALFORCE_108JP-event-kbd -> ../event0
この結果から
- キーボード
- マウス
- SteelSeries_SteelSeries_Rival_310_eSports_Mouse が接続されている・・・以下略
ということがわかります
デバイスファイル event0 を指定して、スキャンコード(キーコード)を確認します
$ sudo evtest /dev/input/event0
caps lock キーを押すと 以下のような出力が出ます
Event: time 1663581487.269647, -------------- SYN_REPORT ------------ Event: time 1663581487.369646, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70039 Event: time 1663581487.369646, type 1 (EV_KEY), code 58 (KEY_CAPSLOCK), value 0
value 70039 の 70039 が caps lockキーのスキャンコード(キーコード)です
evtestを終了するときは Ctrl + C を押します
これで必要なスキャンコードを調べます
キー | コード |
全角半角 (grave) | 70035 |
esc | 70029 |
caps lock | 70039 |
left ctrl | 700e0 |
設定ファイルの作成
設定ファイルは /etc/udev/hwdb.d/90-keyboard.hwdb とします
書式は
evdev:input:b*v<venderID>p<productID>* KEYBOARD_KEY_<スキャンコード>=<キーコード> KEYBOARD_KEY_<スキャンコード>=<キーコード> KEYBOARD_KEY_<スキャンコード>=<キーコード> KEYBOARD_KEY_<スキャンコード>=<キーコード> :
です
(venderID)と(productID)はキーボードのIDです.4桁の16進数,アルファベットは大文字で記述します
キーコードはシンボル名で指定します
シンボル名の一覧は
- /usr/include/linux/input-event-codes.h
あたりで確認できます
たとえば caps lockキーなら
$ grep -i caps /usr/include/linux/input-event-codes.h
で
#define KEY_CAPSLOCK 58 #define LED_CAPSL 0x01
という感じで KEY_CAPSLOCK が見つかります.
この定義から シンボル名を取り出すには
- KEY_ を取り除いた残りの文字列に対して
- すべて小文字に変換します
これで capslock がシンボル名であることがわかります
最終的な設定ファイルの例
調べた情報をまとめると,次のようになります
- ID
- venderIDは0853
- productIDは013F (Fは大文字で記述すること)
- caps lockキーに ctrlを割り当てる
- caps lockのスキャンコード: 70039
- ctrlキーのシンボル名: leftctrl
- ctrlキーにcaps lockキーを割り当てる
- ctrlキーのスキャンコード: 700e0
- ctrlキーのシンボル名: capslock
これをもとに設定ファイルを作成すると,こうなります
evdev:input:b*v0853p013F* KEYBOARD_KEY_70039=leftctrl KEYBOARD_KEY_700e0=capslock
設定の反映
データベースは /etc/udev/hwdb.bin というファイルにキャッシュされています.
設定ファイルの内容で、このファイルを更新します
$ sudo udevadm hwdb --update
設定を反映させます
$ sudo udevadm trigger
動作確認
$ udevadm info /dev/input/by-path/*-usb-*-kbd | grep KEYBOARD_KEY
E: KEYBOARD_KEY_70039=leftctrl E: KEYBOARD_KEY_700e0=capslock
設定が表示されれば成功です.
うまく行かない場合
参考URL
以下のサイト・ブログを参考にしました.感謝!