键盘按键重映射

最近发现用了几年键盘,有些按键失灵了,并且还发现某些键和另外的按键串了起来,比如按“backspace”会出现退格键与“pageup”键一起按下的现象,让我十分不爽。但除单独几个按键之外,其他按键都比较正常,估计内部硬件存在问题。

也不想排查了,干脆重新改一下,让系统忽略这些按键。因为“pageup”这种按键基本用不上,忽略也没关系。

使用方法

Ubuntu 22.04 LTS以下

在旧版本Ubuntu(或使用X11的环境),可以用xmodmap命令。

1、安装x11-xserver-utils

1
2
sudo apt install x11-xserver-utils

2、查看各按键键码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
xmodmap -pke
# 示例如下:
keycode 9 = Escape NoSymbol Escape
keycode 10 = 1 exclam 1 exclam
keycode 11 = 2 at 2 at
keycode 12 = 3 numbersign 3 numbersign
keycode 13 = 4 dollar 4 dollar
keycode 14 = 5 percent 5 percent
keycode 15 = 6 asciicircum 6 asciicircum
keycode 16 = 7 ampersand 7 ampersand
keycode 17 = 8 asterisk 8 asterisk
keycode 18 = 9 parenleft 9 parenleft
keycode 19 = 0 parenright 0 parenright
keycode 20 = minus underscore minus underscore
keycode 21 = equal plus equal plus
keycode 22 = BackSpace BackSpace BackSpace BackSpace
keycode 23 = Tab ISO_Left_Tab Tab ISO_Left_Tab
keycode 24 = q Q q Q
keycode 25 = w W w W
keycode 26 = e E e E

3、创建文件

1
2
3
4
5
6
7
vim ~/.Xmodmap
# pageup 按键键码是112 ,忽略pageup按键
keycode 112 =

# CapsLock键码是66,映射为 ESC
keycode 66 = Escape

4、配置文件生效

1
2
# 可以配置到profile中,设置开机加载
xmodmap ~/.Xmodmap

Ubuntu 22.04 LTS及以上

因为Ubuntu 22.04+ 默认 Wayland,xmodmap在Wayland 下不生效,改用hwdb方式。

1、获取按键扫描码(scancode)

1
sudo evtest

示例如下:

发现按下退格时候,上报了两个键值。首先是退格键,然后是pageup键。退格键扫描码为7002a,pageup键扫描码为7004b.

2、编写hwdb规则

1
2
3
4
5
sudo vim /etc/udev/hwdb.d/90-disable-pageup.hwdb 
# 添加如下内容
evdev:input:b*v*p*
KEYBOARD_KEY_7004b=reserved

3、按键重映射(视情况修改)
如果你不只是想屏蔽,而是重新映射,只需要把扫描码改为对应的按键,然后保存退出。
例如:

1
2
3
evdev:input:b*v*p*
KEYBOARD_KEY_7002a=esc
KEYBOARD_KEY_7004b=reserved

以下是我整理的按键对应的名称,字母和数字键可以直接用键名,其他按键需要用下面表示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
esc            退出
tab 制表
enter 回车
space 空格
backspace 退格

leftshift 左Shift
rightshift 右Shift
leftctrl 左Ctrl
rightctrl 右Ctrl
leftalt 左Alt
rightalt 右Alt

capslock 大写锁定

f1-f12 功能键

up/down/left/right 方向键

pageup/pagedown
home/end
insert/delete

reserved 屏蔽(不触发任何键)

4、更新udev数据库

1
2
3
4
# 更新
sudo systemd-hwdb update
# 触发更新
sudo udevadm trigger