我将尝试详细描述该问题。我经常在上网本上使用外部键盘。键盘是“TK Stealth”:
您可以看到,数字键盘与经典数字键盘非常相似,但箭头键实际上映射不同 - 就像宽键盘上的附加箭头键一样。
我想让它们像数字键盘一样映射,即“8”==“向上”,“2”==“向下”,“4”==“左”,“6”==“右”和很快。
仅当连接了此类键盘时,这些设置才有效。
我尝试使用xmodmap /home/johnfound/TKStelth
以下地图文件“TKStelth”来实现此目的:
keycode 79 = KP_Home KP_Home KP_Home KP_Home
keycode 80 = KP_Up KP_Up KP_Up KP_Up
keycode 81 = KP_Prior KP_Prior KP_Prior KP_Prior
keycode 83 = KP_Left KP_Left KP_Left KP_Left
keycode 84 = KP_Begin KP_Begin KP_Begin KP_Begin
keycode 85 = KP_Right KP_Right KP_Right KP_Right
keycode 87 = KP_End KP_End KP_End KP_End
keycode 88 = KP_Down KP_Down KP_Down KP_Down
keycode 89 = KP_Next KP_Next KP_Next KP_Next
keycode 90 = KP_Insert KP_Insert KP_Insert KP_Insert
keycode 91 = KP_Delete KP_Delete KP_Delete KP_Delete
它确实有效,但也有丑陋的副作用。例如,有时布局恢复为默认值,我必须手动运行上述脚本。将该脚本包含到初始化脚本中会导致一些冲突/锁定,从而使操作系统在从挂起状态恢复并更改屏幕分辨率后挂起几分钟。这样,我被迫从初始化脚本中删除脚本。
我在某处读到 xmodmap 实际上是处理键盘布局的旧方法。
那么问题来了:如何配置 Linux 来正确处理这个且仅处理这个键盘?
其他信息:带有 XFCE 的 Manjaro Linux。键盘配置有两种布局 - 美国和保加利亚语,并且在上述配置更改后它们必须保留。
答案1
只要我找到正确的解决方案,我就会回答我自己的问题。
有一个程序叫关键模糊它可以根据输入设备更改内核使用的键盘映射 - 即分别针对连接到计算机的每个键盘。
该程序有两个问题在文档中没有正确描述:
- USB 键盘生成扫描码,而不是连接到 ps/2 端口的键盘的扫描码。这样,如果您需要重新映射 USB 键盘,您将需要一种方法来知道按键的扫描码。通常推荐用于测试扫描码和键码的工具“showkey”不是完成这项工作,因为它读取
/dev/console
发出“标准”扫描代码的表单,而不管键盘如何。
为了根据键盘的/dev/input/KEYBOARD
地址测试键盘的扫描码,您需要使用名为的程序获取扫描代码。请注意,从上述链接下载的文件未正确压缩。它被命名为getscancodes.tar.gz
,但采用 ZIP 算法压缩。该包包含源代码以及预编译的二进制文件。
就我而言,keyfuzz 配置文件如下所示:
### evdev 1.0.0., driver 'TK Stealth keyboard'
### Proper old-style numpad handling
0x70059 107
0x7005A 108
0x7005B 109
0x7005C 105
0x7005D 108
0x7005E 106
0x7005F 102
0x70060 103
0x70061 104
0x70062 110
0x70063 111
- 程序“keyfuzz”在引导期间作为服务启动,以便尽早修补表。不幸的是,USB 键盘是后来添加到设备中的,因此当 keyfuzz 启动时,即使在启动过程中连接了 USB 键盘,也没有键盘需要修补。
解决方案是使用udev
规则文件并在添加所需键盘时启动 keyfuzz。
为此,您需要添加一个文件/etc/udev/rules.d/mykeyboard.rules
,其中包含(在我的例子中):
ACTION=="add", ATTRS{idVendor}=="2516", RUN+="/usr/lib/systemd/scripts/keyfuzz start"
现在,插入键盘后,keyfuzz 启动脚本将启动并修补键盘解码表。