键盘输入

出自 ArchWiki
(重定向自 Showkey)

修改按键映射的先决条件是了解按键如何产生符号

  1. 键盘向计算机发送一个扫描码
  2. Linux 内核将扫描码映射到一个 键码;参见 映射扫描码到键码
  3. 键盘布局将键码映射到一个符号或 键符,取决于按下了哪些修饰键

您的大部分按键应该已经有一个 键码,或者至少是一个 扫描码。没有 扫描码 的按键不会被内核识别;这些可能包括来自“游戏”键盘等的额外按键。

在 Xorg 中,一些键符(例如 XF86AudioPlayXF86AudioRaiseVolume 等)可以映射到操作(即启动外部应用程序)。有关详细信息,请参见 键盘快捷键#Xorg

在 Linux 控制台中,一些键符(例如 F1F246)可以映射到某些操作(例如,切换到其他控制台或打印一些字符序列)。有关详细信息,请参见 控制台键盘配置#创建自定义键映射

识别扫描码

使用 evtest

获取 扫描码 最可靠的方法是参考按下按键时产生的 MSC_SCAN evdev 事件 [1]。有多个 evdev API 测试工具,但最直接的是来自 evtest 软件包的 evtest(1)

# 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

注意: 手册页指出原始扫描码模式在现代内核上“根本不是很原始”。似乎此方法对于特别是 USB 设备会产生不正确的结果。

获取 扫描码 的传统方法是使用 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 中识别键码

此条目或章节需要扩充。

原因: xev 也会报告键符。提及您需要聚焦 “Event Tester” 窗口。(在 Talk:Keyboard input 中讨论)
注意: 与 Linux 键码 相比,Xorg 键码 递增了 8。[2]

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

Xbindkeysxev 的另一个包装器,也报告 键码

如果您按下按键但在终端中没有任何显示,这意味着该按键要么没有 扫描码,要么 扫描码 没有映射到 键码,或者某些其他进程正在捕获按键。如果您怀疑监听 X 服务器的进程正在捕获按键,您可以尝试从干净的 X 会话运行 xev

$ xinit /usr/bin/xterm -- :1

在 Wayland 中识别键码

虽然 xev 可以通过 xwayland 工作,但您也可以使用 wev 在纯 Wayland 下访问键码。

例如,此命令使您可以仅检索按键名称及其 UTF-8 等效项

$ wev | grep 'sym'

提示与技巧

VIA 兼容键盘的配置

VIA 是一个直接将按键重映射到兼容键盘的程序。如果您有其中一个键盘,为了使浏览器能够识别键盘并在网上配置它,您需要添加自定义的 udev 规则,以更改通过 hidraw 驱动程序访问的设备的权限。

注意: 此方法可能存在安全风险。

创建 以下 udev 规则

/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 软件