键映射与 OSI 模型具有类似的流程,尽管定义不那么明确。我目前正在以比我想要的更高的级别重新映射。显然,第 1 层对应于物理键盘,第 7 层对应于应用程序,但我不确定还有多少其他层或它们的排列位置。
如果这是一台带有专用可编程物理键盘的台式机,我就可以了,但可惜,这是一台笔记本电脑,我需要在使用内置键盘时维护重新映射。
FWIW,我正在交换以下键对:[Tilde/Esc]、[Caps/LCtrl]、[Back{space,slash}]。我也使用 Dvorak,但它是在操作系统中以标准方式配置的。
目前,我正在修改 /usr/share/X11/xkb/keycodes/evdev 以在 X 中进行更改(并为控制台创建自定义布局文件,但这与此处无关)。我不确定它在“层堆栈”中的位置。
问题:我的键盘映射不会转换为 Proxmox 控制台会话,它使用 Web VNC 客户端。 (布局也不适用,但这是预期的。)问题显然是 VNC 客户端将键盘挂接到尚未应用 evdev 重新映射的较低层。
在 Windows 中,我使用一个名为 KeyTweak 的实用程序来生成注册表的扫描码映射,这似乎基本上是“第 3 层”。我玩过的游戏显然将键盘挂在“第 2 层”,但这几乎不成问题,因为大多数游戏中的输入很少。
综上所述,我不确定 evdev 在我想象的 OSI 键盘模型中的位置,但如何在较低层重新映射?我不需要出于任何原因换出重新映射,因此这种更改基本上可以是永久性的。如果我能在 BIOS 中做到这一点,我会的。
答案1
答案竟然是udev。我基本上是跟着这个帖子,但要点是:
- 安装
evtest
- 运行
evtest
并按要重新映射的键即可查看两个都扫描码和键码。 /etc/udev/hwdb.d/
创建一个名为类似70-keyremap.hwdb
以下内容的 新文件- 我假设这个数字是文件的顺序,但我没有任何现有文件作为其基础,所以我不确定它的先决条件是什么,它可能需要比它更高的数字。事实上,
hwdb.d
Tumbleweed 上的目录对我来说并不存在,所以我必须创建它,但它仍然有效。
- 我假设这个数字是文件的顺序,但我没有任何现有文件作为其基础,所以我不确定它的先决条件是什么,它可能需要比它更高的数字。事实上,
- 跑步
systemd-hwdb update
。 - 重启
_
# This is from the brokkr.net post I linked above
# Format can be found on [https://wiki.archlinux.org/title/Map_scancodes_to_keycodes].
$ cat 70-keymap.hwdb
evdev:atkbd:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
KEYBOARD_KEY_01=41 # Remap Tilde to Esc
KEYBOARD_KEY_29=01 # Remap Esc to Tilde (evtest showed "1" but when I put that without the leading zero, it was interpreted as the literal [1] key.)
KEYBOARD_KEY_3A=29 # Remap Caps to LCtrl
KEYBOARD_KEY_1D=58 # Remap LCtrl to Caps
KEYBOARD_KEY_0E=43 # Remap Backspace to Backslash
KEYBOARD_KEY_2B=14 # Remap Backslash to Backspace
更新:
上述方法在我的笔记本电脑上效果很好,但是当我连接它时,外部键盘仍然使用默认的键盘映射。事实证明,这是因为内部键盘使用 PS/2 进行通信,PS/2 仍然使用 AT 扫描码(atkbd
在设备字符串中),但 USB 完全不同。我最终不得不再次运行 evtest 以从 USB 板上获取扫描码并编写另一张地图。这是我生成的文件:
evdev:atkbd:dmi:*
KEYBOARD_KEY_01=41
KEYBOARD_KEY_29=01
KEYBOARD_KEY_3A=29
KEYBOARD_KEY_1D=58
KEYBOARD_KEY_0E=43
KEYBOARD_KEY_2B=14
evdev:input:b0003v*
KEYBOARD_KEY_70029=41
KEYBOARD_KEY_70035=01
KEYBOARD_KEY_70039=29
KEYBOARD_KEY_700e0=58
KEYBOARD_KEY_7002a=43
KEYBOARD_KEY_70031=14