ArchLinux下ThinkPad X1 Carbon 5代额外按键映射方案咨询
解决ThinkPad X1 Carbon 5代ArchLinux额外按键重映射问题
我之前在同款机型上折腾过这类额外按键的映射,xev抓不到、xmodmap失效的坑确实踩过,给你几个亲测有效的方案:
第一步:先确认按键的底层信息
首先得把你的按键对应的扫描码和设备标识搞准,既然evtest已经能抓到,咱们再细化下:
- 运行
sudo evtest,从列表里选带"ThinkPad"字样的键盘input设备 - 按下无功能按键,你会看到类似这样的输出:
重点记两个值:Event: time 1699999999.999999, type 4 (EV_MSC), code 4 (MSC_SCAN), value 0x150 Event: time 1699999999.999999, type 1 (EV_KEY), code 374 (KEY_UNKNOWN), value 1MSC_SCAN对应的0x150(扫描码),以及EV_KEY对应的code 374(input层键码) - 再用
udevadm info -q all -n /dev/input/eventX(把eventX换成evtest里的设备号),拿到设备的总线、厂商、产品ID,比如输出里的:E: BUSNUM=003 E: ID_VENDOR_ID=17ef E: ID_MODEL_ID=6019
方案一:用udev hwdb(推荐,支持Xorg和Wayland)
这是底层映射方案,不管你用Xorg还是Wayland都能生效,也是最稳定的方法:
- 创建自定义hwdb文件:
sudo nano /etc/udev/hwdb.d/90-thinkpad-extra-keys.hwdb - 写入以下内容(把占位符换成你刚才拿到的信息):
比如我的设备信息填完后是:evdev:input:b<BUS_NUM>v<VENDOR_ID>p<PRODUCT_ID>e* KEYBOARD_KEY_<SCAN_CODE>=<TARGET_KEY>
这里的evdev:input:b0003v17EFp6019e* KEYBOARD_KEY_150=f13<TARGET_KEY>可以填你想要的键名,比如f13、xf86launchb、volumeup这类,完整键名列表可以查看/usr/include/linux/input-event-codes.h - 更新hwdb并触发udev生效:
现在按下按键应该就能触发对应功能了,重启后也会自动生效。sudo systemd-hwdb update sudo udevadm trigger
方案二:Xorg专属的xkb/xinput配置
如果你只用Xorg桌面环境,可以用这个方法:
- 先把input层键码映射到Xorg键码:
运行xinput list找到你的键盘设备ID,比如12: ThinkPad Keyboard
再用xinput test 12按下目标按键,查看Xorg识别到的键码(比如366) - 用xinput直接设置映射:
比如要把它设为F13(X键码是191,你可以用xmodmap -pke | grep F13确认),运行:
要是想永久生效,把这条命令加到你的桌面启动脚本里(比如xinput set-keymap 12 366 191~/.xinitrc或者桌面环境的自启动项) - 或者用自定义xkb配置:
创建/usr/share/X11/xkb/symbols/custom文件:
然后用命令加载配置:partial alphanumeric_keys xkb_symbols "extra_keys" { key <I366> { [ F13 ] }; // I366对应刚才查到的Xorg键码 };setxkbmap -rules evdev -model thinkpad -layout us -variant custom:extra_keys
方案三:用evremap用户空间工具
如果觉得udev配置太繁琐,可以试试evremap,它是专门做按键映射的轻量工具:
- 安装evremap:
sudo pacman -S evremap - 创建配置文件
~/.config/evremap/config.toml:[[devices]] name = "ThinkPad Compact Keyboard II" # 填evtest里看到的设备名 [[devices.mappings]] from = "KEY_UNKNOWN" # 填evtest里的KEY_XXX标识 to = "KEY_F13" - 启动并启用服务:
systemctl --user enable --now evremap.service
为什么xmodmap没用?
xmodmap只能处理Xorg已经识别的键码,如果xev抓不到按键,说明这个按键的input事件根本没被Xorg转换成X系统能识别的键码,xmodmap自然没法处理。这时候必须先在底层(udev)或者用xinput把input层事件映射成X能识别的键码,xmodmap才能发挥作用。
内容的提问来源于stack exchange,提问作者navxio
相关产品推荐
相关产品推荐

