无需 xmodmap 或任何 X 工具即可重新映射按键

无需 xmodmap 或任何 X 工具即可重新映射按键

由于咖啡事故,我的笔记本电脑键盘的一些数字停止工作。我曾经xmodmap使用F1F2等作为替代品,并将配置保存到~/.Xmodmap

然而,这导致了一些问题。

  1. 我并不总是在这台计算机上使用 X,并且不启动 Xxmodmap则不适用。

  2. 这导致 X 需要更多时间才能启动。

  3. 由于某种原因,它导致与通过更改的任何键无关的 XFCE 键盘快捷键xmodmap停止工作(事实上,除窗口管理器快捷键外,所有键盘快捷键都停止工作)。启动 X 几分钟后,XFCE 快捷键又开始正常工作!这种延迟不是很烦人,但也是一个问题。

我猜想在 X 启动之前,操作系统会读取某种映射。有没有办法更改该映射?有没有办法不使用 X 工具来更改键盘映射?我使用的是 Debian 稳定版。

xmodmap .XmodmapPS:显然,调用的文件startx/etc/xdg/xfce4/xinitrc。其内容可以在这里

答案1

首先,好消息

Linux 系统控制台绝对有自己的一组键盘映射,可以使用软件包中的工具进行管理kbd,具体来说dumpkeysshowkey用于发现和loadkeys加载自定义映射。超级用户问题如何在 Linux 中更改控制台键盘映射?有一个答案,其中包含有关如何使用这些工具的有用信息。

现在,坏消息是

虽然这些工具确实允许你重新映射 Linux 控制台上的按键,而无需xmodmap或要求 X 正在运行,但它们将仅有的影响虚拟文本控制台上的键映射。这些更改对图形环境完全没有影响,因为 X 的 XInput/evdev 系统直接从输入设备读取并进行自己的处理。

因此,如果您希望xmodmap通过在控制台上重新映射并使其应用于所有地方来避免使用,恐怕这行不通。事实上,您需要重新映射两个都控制台(使用loadkeysX11(使用类似的方法xmodmap),在任何地方使用相同的键盘布局。

解决xmodmap速度慢(和错误多,因为在使用布局切换的桌面环境中,它的重新映射会出现故障且不持久)的方法是定义一个完全新的基于您之前使用的布局,而不是应用运行时修改。在 X 启动时,您将加载新的、重新映射的布局,而不是您现在使用的布局。(这似乎是现在仅有的可靠地修改最近的 Ubuntu(以及可能的其他发行版)中的键盘布局的方法,因为它们xmodmap不再有用。

有关定义和使用自定义xkb键盘布局的信息,请参阅:

  1. 如何:自定义键盘布局定义在 Ubuntu 社区 Wiki 中。
  2. 如何在 Linux 中修改键盘布局,由 Romano Giannetti 撰写的博客文章。

两篇文章都是今年 (2014) 撰写的,因此信息应该是最新的。Ubuntu wiki 信息应该适用于大多数发行版,因为它们都使用xkbX 系统。

答案2

实际上,存在一些方法可以在足够低的级别上重新映射以应用于整个系统(无论是否是 X11),而且现在我们看到 Wayland 合成器的采用忽略了为 libinput 的重新映射支持公开 UI,因此它们变得比以往任何时候都更加重要。

您基本上需要重新配置内核的输入层如何在原始扫描码到达控制台或 X11 和 Wayland 所依赖的 evdev API 之前将其转换为键码。

我知道有两种方法可以做到这一点:

  1. hwdb修改键盘的硬件数据库 ( ) 条目。udev 允许您通过向 添加规则文件/etc/udev/hwdb.d/并使用 触发数据库重建来实现这systemd-hwdb update一点,然后通过 强制应用它而无需重新启动udevadm trigger

    这个 ArchiWiki 页面有完整的说明,并明确说明它适用于 X11 和控制台输入。

  2. 有一个名为evdevremapkeys它是专门为将 evdev 设备上的关键事件重新映射到 monkey-patch 重新映射支持到不支持它们的 evdev 客户端(如 Wayland 合成器)而编写的。

    它基本上使用与 G15Daemon 等用户空间驱动程序相同的方法,这些驱动程序需要补偿非标准输入设备。(打开 evdev 设备,吞下它打算重新映射的任何事件,因此设备上的其他任何监听设备都无法看到它们,然后通过 API 发出更正后的事件,uinput以便从用户空间创建内核级输入设备。)

答案3

尽管使用了 X 显示服务器,但 X 专用工具对我来说不起作用。我不想自己编写代码。我搜索了一天,直到找到一个可行的解决方案。更好的是,它也可能适用于其他发行版。

我发现并测试过柯莫纳德作为第一次使用,很困惑之前没有人提到过它。它仅适用于非常特定的包管理器,但你可以使用 Docker 自动构建这对我有用,但花了相当长的时间。

KMonad 读取文本配置文件作为如何修改独立于显示服务器的键盘的指令。ioctl只要进程正在运行,它就会使用并工作。您只需要在启动时以超级用户 (sudo) 权限运行它。(编辑:可能适用于 systemd。)好处:启动后,它可以在睡眠模式或任何与键盘相关的切换和停用中存活下来,因为 KMonad 会继续在后台运行。

KMonad 还支持更强大的功能,如宏、多个键盘上下文(它称之为“层”)和 shell 命令执行。我现在隐藏了这些,因为没有人要求这样做。这种强大功能源自配置中各个功能的可组合性。

他们写道,它可以在 Windows 和 Mac 上运行(我没有尝试过)。

如果您介意的话,配置文件有一个 VSCode 语法高亮扩展。我认为唯一的缺陷是缺少 GUI。但我认为,如果有人想尝试的话,它非常适合练习 GUI 开发。

(在垃圾邮件指控后略作编辑。如果答案与问题不符,我很抱歉。)

相关内容