Arch Linuxでキーマップをカスタマイズする

## 序文
ノートパソコンを買いました。いい感じだなぁと思ったノートパソコンなんですがキーボードがあまり好きじゃありません。

買ったパソコン

https://www.amazon.co.jp/Zwide-%E3%83%8E%E3%83%BC%E3%83%88%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3-Windows11-%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89-%E3%82%BF%E3%83%83%E3%83%81%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3/dp/B0D5MHGNMF?source=ps-sl-shoppingads-lpcontext&ref_=fplfs&ref_=fplfs&psc=1&smid=A2YZ70LSNLO0NS

AliExpressでこれの英字キーボードっぽいものが売ってました

https://ja.aliexpress.com/item/1005007237616463.html?spm=a2g0o.order_list.order_list_main.5.499f585aLJ1GQu&gatewayAdapt=glo2jpn

このキーボードに貼り直したのですが、ところどころキーボードの印字と入力される文字が一致しません。
(実際にこの改造を試す場合は自己責任でお願いします。)
以下ではキーの印字とキーマップを一致させる上での手順を説明していきます。
環境は archlinux 6.10.9 です。

## 方法

まず次のファイルを作成し編集します。ファイル名 10-zwide.hwdb は多分なんでもいいと思いますが、念の為 "適当な数字-適当な名前.hwdb" のような形式にはしています。
    
```
$ sudo emacs /etc/udev/hwdb.d/10-zwide.hwdb
```
``` /etc/udev/hwdb.d/10-zwide.hwdb
evdev:input:b0011v0001p0001eAB83*
 KEYBOARD_KEY_3b=tab
 KEYBOARD_KEY_35=rightshift
 KEYBOARD_KEY_2b=slash
 KEYBOARD_KEY_3e=backslash
 KEYBOARD_KEY_28=dot
 KEYBOARD_KEY_33=semicolon
 KEYBOARD_KEY_34=apostrophe
 KEYBOARD_KEY_7d=minus
 KEYBOARD_KEY_d3=equal
 KEYBOARD_KEY_27=comma
 KEYBOARD_KEY_3f=leftbrace
 KEYBOARD_KEY_0c=rightbrace
 KEYBOARD_KEY_0d=grave
 KEYBOARD_KEY_1a=delete
```

ファイルを作成、編集した後に次のコマンドを実行します。
```
$ sudo udevadm hwdb --update
$ sudo udevadm trigger
```
手順は以上です。
問題はこのファイルの1行目、2行目以降をどのように調べるかです。
### 1行目
まずはキーボードデバイスのデバイスファイルを調べます。
```
$ cat /proc/bus/input/devices
```
この出力結果のうちN:の行がキーボードっぽくなっているブロックを探します。
このブロックのH:の行の最後にあるeventNがデバイスファイルです。(今回の例ではevent4でした)

```
...

I: Bus=0011 Vendor=0001 Product=0001 Version=ab83
N: Name="AT Translated Set 2 keyboard"
P: Phys=isa0060/serio0/input0
S: Sysfs=/devices/platform/i8042/serio0/input/input4
U: Uniq=
H: Handlers=sysrq kbd leds event4
B: PROP=0
B: EV=120013
B: KEY=402000000 3803078f800d001 feffffdfffefffff fffffffffffffffe
B: MSC=10
B: LED=7
...
```
次のコマンドでキーボードデバイスのmodaliasを取得します。
```
$ cat /sys/class/input/event4/device/modalias
input:b0011v0001p0001eAB83-e0,1,4,11,14,k71,72,73,74,75,76,77,79,7A,7B,7C,7D,7E,7F80,8C,8E,8F,9B,9C,9D,9E,9F,A3,A4,A5,A6,AC,AD,B7,B8,B9,D9,E2,ram4,l0,1,2,sfw
```
この出力の序盤の-e0の直前部分の前にevdev:、あとに * を付加したもの
evdev:input:b0011v0001p0001eAB83*
が/etc/udev/hwdb.d/10-zwide.hwdbの1行目となります。

### 2行目以降
先程取得したデバイスファイルをもとに次のコマンドを実行します。(arch linuxではデフォルトで入っていなかったので　$ sudo pacman -S evtest　でインストールしました)

```
$ sudo evtest /dev/input/event4
```
するとキーボード入力に対して次のような出力が帰ってくる画面が出てきます。
```
Event: time 1726481457.363467, type 4 (EV_MSC), code 4 (MSC_SCAN), value 1e
Event: time 1726481457.363467, type 1 (EV_KEY), code 30 (KEY_A), value 0
Event: time 1726481457.363467, -------------- SYN_REPORT ------------
```
この例はAを押した場合のものです。
1行目のvalueの値(1e)と2行目のcodeのKEY_見続く文字(A)が紐付けられています。
/etc/udev/hwdb.d/10-zwide.hwdbの2行目以降は
KEYBOARD_KEY_キーのコード=割り当てたい文字
のような形になっています。

## 終わりに
とりあえず普段使いで困らない程度にはなりました。
改善点としては、一部のFnキーを押しながら操作するキー(キーボードバックライトや画面の明るさ、Fn-Nなど)の割当です。
Fn+キーが一つの割当になっているものもあれば、そもそもキーコードが割り当てられていないものもあるようです。
もっと楽な方法、間違い等の指摘があればぜひ

## 参考にしたサイト

ほとんどは次のサイトの再現

https://zenn.dev/tmtms/articles/202109-remap-key

設定ファイルの書式

https://wiki.archlinux.jp/index.php/%E3%82%B9%E3%82%AD%E3%83%A3%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E3%82%AD%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E3%83%9E%E3%83%83%E3%83%97

デバイスファイルの調べ方

https://zenn.dev/tmtms/articles/202201-rkremap

キーボードの割当先に使える名称の一覧

https://hal.freedesktop.org/quirk/quirk-keymap-list.txt