键盘输入
修改按键映射的先决条件是了解按键按下是如何产生符号的
- 键盘发送一个 扫描码 到计算机。
- Linux 内核将扫描码映射到键码;参见 映射扫描码到键码。
- 键盘布局 将键码映射到一个符号或 keysym,取决于按下了哪些 修饰键。
- 对于 Linux 控制台,参见 Linux 控制台/键盘配置。
- 对于 Xorg 和 Wayland,参见 Xorg/键盘配置。
您的大部分按键应该已经有一个键码,或者至少有一个扫描码。没有扫描码的按键不会被内核识别;这些可能包括来自“游戏”键盘等的附加按键。
在 Xorg 中,一些 keysyms (例如 XF86AudioPlay
, XF86AudioRaiseVolume
等) 可以被映射到动作 (即,启动外部应用程序)。 参见 键盘快捷键#Xorg 获取详细信息。
在 Linux 控制台中,一些 keysyms (例如 F1
到 F246
) 可以被映射到特定动作 (例如,切换到其他控制台或打印一些字符序列)。 参见 控制台键盘配置#创建自定义键盘映射 获取详细信息。
识别扫描码
使用 evtest
获取扫描码最可靠的方法是参考当按下按键时生成的 MSC_SCAN
evdev 事件 [1]。 有多种 evdev API 测试工具,但最直接的是 evtest(1),它来自 evtest 软件包
# evtest /dev/input/event12
... Event: time 1434666536.001123, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70053 Event: time 1434666536.001123, type 1 (EV_KEY), code 69 (KEY_NUMLOCK), value 0 Event: time 1434666536.001123, -------------- EV_SYN ------------
evtest
,它将显示设备列表及其事件编号,然后您可以输入所需的编号。使用 MSC_SCAN
的 “value” 字段。 此示例显示 NumLock 的扫描码为 70053,键码为 69。
使用 showkey
获取扫描码的传统方法是使用 showkey(1) 实用程序。 showkey 等待按键按下,或者如果在 10 秒内没有按键按下则退出。 为了使 showkey 工作,您需要处于虚拟控制台中,而不是在图形环境或通过网络连接登录。 运行以下命令
# showkey --scancodes
并尝试按下键盘按键;您应该看到扫描码被打印到输出。
使用 dmesg
您可以通过按下所需的按键并查看 dmesg 的输出来获取按键的扫描码。 例如,如果您得到
Unknown key pressed (translated set 2, code 0xa0 on isa0060/serio0
那么您需要的扫描码是 0xa0
。
识别键码
Linux 键码在 /usr/include/linux/input-event-codes.h
中定义 (参见 KEY_
变量)。
在控制台中识别键码
虚拟控制台 的键码由 showkey(1) 实用程序报告。 showkey 等待按键按下,如果在 10 秒内没有按键按下,它将退出。 要执行 showkey,您需要处于虚拟控制台中,而不是在图形环境中。 运行以下命令
# showkey --keycodes
并尝试按下键盘按键;您应该看到键码被打印到输出。
在 Xorg 中识别键码
Xorg 使用的键码由名为 xev(1) 的实用程序报告,该实用程序由 xorg-xev 软件包提供。 当然,要执行 xev,您需要在图形环境中,而不是在控制台中。
使用以下命令,您可以启动 xev 并仅显示相关部分
$ xev | awk -F'[ )]+' '/^KeyPress/ { a[NR+2] } NR in a { printf "%-3s %s\n", $5, $8 }'
38 a 55 v 54 c 50 Shift_L 133 Super_L 135 Menu
Xbindkeys 是 xev 的另一个包装器,它也报告键码。
如果您按下某个按键,但终端中没有任何显示,则表示该按键要么没有扫描码,要么扫描码未映射到键码,或者其他进程正在捕获按键。 如果您怀疑正在监听 X 服务器的进程正在捕获按键,您可以尝试从干净的 X 会话中运行 xev
$ xinit /usr/bin/xterm -- :1
在 Wayland 中识别键码
尽管 xev 可以通过 xwayland 工作,但您也可以使用 wev 来访问纯 Wayland 下的键码。
例如,以下命令让您仅检索键名及其 UTF-8 等效项
$ wev | grep 'sym'
技巧与提示
VIA 兼容键盘的配置
VIA 是一个直接将按键重新映射到兼容键盘的程序。 如果您有其中一个键盘,为了使浏览器能够识别键盘并在网上配置它,您需要添加自定义的 udev 规则,以更改通过 hidraw 驱动程序访问的设备的权限。
/etc/udev/rules.d/99-via.rules
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0666", TAG+="uaccess", TAG+="udev-acl"
然后 重新加载规则 以使其生效。
参见
- kbd-project - showkeys 实用程序的官方网站
- interception-tools - 一组用于控制和自定义键盘输入映射行为的实用程序
- kmonad - 一个高级的按键重绑定和重映射守护程序
- Hawck - 另一个按键重绑定守护程序
- keyd - 简化的按键重绑定守护程序
- Vial - VIA 独立程序
- Keyshift - 面向性能的 Linux 键盘分层和重映射软件