以与 X/控制台无关的方式更改控制台 (tty) 和 X 上的键盘布局/映射?

éta*_*ogy 9 keyboard keyboard-layout

我已经能够在X Window System运行时更改键盘布局/映射~/.Xmodmap(我想你也可以直接通过X 协议来完成,例如使用libxcb作为 X 协议调用的包装器)。

我已经能够在控制台/tty(即当 X 未运行时)使用loadkeys.

有没有一种方法可以类似地自定义键盘布局,但来自单一来源,以这样的方式影响 X 和控制台,即。以一种“X 和控制台不可知论”的方式?

(我能想到的唯一方法是编写一个“键盘驱动程序”,它与内核的输入接口对话evdev,并发送您想要的输入(通过uinput?),或者其他什么,但我不知道这是否有意义,或者如果有更简单的方法。)

Jde*_*eBP 16

是的,有一种方法,这确实是 Debian 的 console-setup 软件包的做法。

  • 键盘布局由管理员在 XKB 术语(型号、布局、变体和选项)中指定keyboard,文件名为,通常为/etc/default/keyboard. 这是唯一的来源。它可以使用文本编辑器进行编辑。
  • setxkbmap程序具有相同的 XKB 设置,并相应地配置 X11 服务器。
    • 如果键盘配置包的安装后维护者脚本发现自己带有 X11 显示器,则它会setxkbmap使用/etc/default/keyboard设置直接运行。因此dpkg-reconfigure keyboard-configuration,从 X11 GUI 终端仿真器运行将影响 X11 键盘布局。
  • setupcon脚本采用这些 XKB 设置,将它们传递给ckbcomp实用程序以生成键盘映射,并使用loadkeys/将该键盘映射加载到内核虚拟终端中kbdcontrol
    • 该脚本由服务在系统引导时运行。
    • 它也可以在其他时候手动运行。

其他 systemd 操作系统的工作方式不同,但也具有单一来源。

  • XKB 布局、变体和选项存储在/etc/X11/xorg.conf.d/00-keyboard.conf. 这是唯一的来源。
    • 这个文件在X11服务器启动时直接读取,直接设置X11键盘映射。
    • 该文件systemd-localed在启动时被解析。该文件在systemd-localed运行时无法使用文本编辑器进行有用的编辑,因为该服务会用自己的内存信息轻松地覆盖它。
    • 要更改 XKB 信息,运行localectl,它与另一台服务器交谈,后者又与 交谈systemd-localed
  • systemd-localed使用 中的映射将 XKB 设置转换为虚拟终端键盘映射名称/usr/share/systemd/kbd-model-map,然后将其写入/etc/vconsole.conf. 与 Debian 系统不同,它不会根据 XKB 信息动态生成地图,而是仅选择地图文件中列出的预先提供的静态地图。
  • systemd-vconsole-setup在引导程序中运行,读取/etc/vconsole.conf,并通过运行 将键盘映射加载到内核虚拟终端中loadkeys

进一步阅读