Ctrlキーとcapsキーを入れ替える(Linuxでudevを使う方法)

キーボード割当を変更して 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

設定が表示されれば成功です.

うまく行かない場合

  • おそらく設定ファイルの先頭, evdev:input の行が間違っています
    • 16進数のアルファベットは大文字で指定しましょう。小文字は認識されず、エラーや警告も出ないようです
  • 別の設定方法としては evdev:デバイス名:dmi:bvn*:bvr*:bd*:svn*:pn* と記述する方法もあります。
    • バイス名は /dev/input/by-name で確認できます

*1:全角半角は grave を指定したほうがIMEの設定が楽です

フォルダを再帰的に辿って、動画ファイルのファイル名と再生時間をcsv形式でまとめて出力する方法

フォルダの中にたくさんある動画ファイルをサーチして,ファイル名と再生時間を CSV形式のファイルにまとめて出力するワンライナーです


find -name "*.mp4" | sort -g  | while read f ; do d=`ffprobe "$f" 2>&1 | grep Duration | cut -d' ' -f 4`; echo $f, $d; done  > movie-list.csv

これで movie-list.csv が出力されます.エクセルなどで開く際は区切り文字で","を指定してください