在 Ubuntu 17 中重新映射按键

在 Ubuntu 17 中重新映射按键

请帮我解决以下问题:我有一个 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> };
};

相关内容