请帮我解决以下问题:我有一个 USB 踏板,我想让它在工作中充当控制键。到目前为止,系统识别出这个踏板正在作为 F2 键工作(我使用的是 Ubuntu 17),我想重新映射系统以将 F2 键理解为控制键。我尝试了几本手册,其中一些提到了似乎已被弃用的 Xmodmap 解决方案,另一个提到了 XKB,由于我的愚蠢,我没能理解。我正在查看您的一些建议,看看我该如何实现这一点。提前谢谢。
答案1
XKB 方法
XKB 可能不是更改此设备行为的最佳方式,但在传统的 X 环境中应该是可行的。较新的 XKB 上下文(如 Wayland 或)kmscon
可能无法提供在任意设备上配置单独的 XKB 布局所需的粒度。它也无法在传统控制台下运行。
应用udev hwdb
覆盖来做出此改变应该在所有这些情况下都有效。
在传统的 X 环境下,setxkbmap
拿起一面-device
旗帜,xkbcomp
用途-i
:
-设备 设备
指定要使用新键盘布局更新的输入设备的数字设备 ID。
用于xinput -list
查找设备 ID 号。
为了证明此功能有效,请使用setxkbmap ... -print
生成基本布局,将其保存到文件,然后使用 加载xkbcomp filename.xkb $DISPLAY
。您可能需要禁用 GNOME/KDE 的键盘设置守护进程在测试时。
$ setxkbmap -layout us -option '' -print > f2toctrl.xkb
编辑文件f2toctrl.xkb
——我们只更改以下xkb_symbols
行:
// generated with `setxkbmap -print` and modified
// load: xkbcomp -i DeviceID# filename $DISPLAY
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols {
include "pc+us+inet(evdev)"
// existing key definition (see `xkbcomp $DISPLAY - | grep -A 3 FK02`)
// key <FK02> {
// type= "CTRL+ALT",
// symbols[Group1]= [ F2, F2, F2, F2, XF86Switch_VT_2 ]
// };
// patterned after ctrl:nocaps option
// see /usr/share/X11/xkb/symbols/ctrl
replace key <FK02> { [ Control_L, Control_L ] };
modifier_map Control { <FK02>, <LCTL> };
};
xkb_geometry { include "pc(pc105)" };
};
现在加载它(N
用您在中找到的设备 ID替换xinput -list
):
$ xkbcomp -i N f2toctrl.xkb $DISPLAY
您可以使用 验证您的更改xkbcomp -i N $DISPLAY - | less
,并在各种应用程序中物理测试该按钮以确保它被识别。
对于普通(非 DE)X 环境,可以将加载命令添加到~/.xinitrc
或其他窗口管理器启动脚本。您需要将该覆盖添加到系统的 XKB 数据库中,以便与大多数 Wayland 合成器和 DE(如 GNOME/KDE)一起使用,但在这些情况下,我不确定如何将覆盖仅应用于踏板设备。如果可行,我会创建/usr/share/X11/xkb/symbols/pedal
以保存Ctrl
上面演示的覆盖(以及可能对设备有用的其他覆盖)。
一个非常简单的布局文件可能看起来像这样:
// /usr/share/X11/xkb/symbols/pedal
// convert F2 key operation to Ctrl
default partial modifier_keys
xkb_symbols "basic" {
name[Group1]= "USB Pedal as Ctrl";
replace key <FK02> { [ Control_L, Control_L ] };
modifier_map Control { <FK02>, <LCTL> };
};