目前同时有台 MacBook Pro 以及 Thinkpad X1,所以想同时使用苹果的蓝牙键盘链接,碰到了键位映射的问题,所以记录下。这次折腾的主要原因是 Thinkpad 的左下角功能键的键位和苹果键盘是不一致,如图:
最主要是对比 Thinkpad 的 Win(Meta) 键和 Alt 和苹果蓝牙键盘的 Apple 和 Alt 是相反的,如果同时使用会有转换的过程,因此需要转换下键位。
硬件方面链接蓝牙的过程就不复述了,Arch Wiki 中有很详细的说明。我使用的是 bluetoothctl 连接硬件,同时使用 BlueMan 作为 GUI 的前端。同时将 BlueMan 加入到 i3wm 的启动脚本中,能够做到自动链接,方便。
键盘链接成功以后,使用 xinput list 查看对应的 device id:
$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Synaptics TM3072-003 id=11 [slave pointer (2)]
⎜ ↳ Logitech M570 id=14 [slave pointer (2)]
⎜ ↳ TPPS/2 IBM TrackPoint id=12 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
↳ Video Bus id=7 [slave keyboard (3)]
↳ Sleep Button id=8 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=9 [slave keyboard (3)]
↳ ThinkPad Extra Buttons id=10 [slave keyboard (3)]
↳ Integrated Camera: Integrated C id=13 [slave keyboard (3)]
↳ Apple Inc. Magic Keyboard id=15 [slave keyboard (3)]
其中,能够看到苹果的蓝牙键盘的 device id 是 15,需要暂时记下这个值。然后使用
$ setxkbmap -option altwin:swap_alt_win -device $DEVICE_ID
就可以测试 Win 键和 Alt 键是否对调成功。顺便说一句,对应的还有个命令可以将 Caps Lock
利用起来:
$ setxkbmap -option ctrl:nocaps -device $DEVICE_ID
这样子 Caps Lock 就映射到 Ctrl 键了。具体更多的设置可以在这里 查看(我是 Arch Wiki 的搬运工 😄)。
这样子还有点不方便的地方,就是每次链接蓝牙键盘的时候都要跑下这个命令,于是还是考虑到使用 udev 脚本去自动化。下面是我的 udev 脚本,可以供参考:
ACTION=="bind", SUBSYSTEM=="hid*", DRIVER=="*apple*", RUN+="/usr/bin/sudo -i -u <user> /<path>/key-mapping.sh"
然后还需要考虑到插入 USB 键盘的情况,这再多加一条规则:
ACTION=="bind", SUBSYSTEM=="usb", ENV{ID_VENDOR}=="Apple*", RUN+="/usr/bin/sudo -i -u <user> /<path>/key-mapping.sh"
其中,key-mapping.sh
是复制下上面命令的脚本。
然后,将这个命令保存到个 rules 文件中,例如我的文件命名是 90-bluetooth-keyboard-mapping.rules
然后放到 /etc/udev/rules.d
。
最后,重启 udev 规则 sudo udevadm control -R
即可。
- eof -