Linux 控制台/键盘配置

来自 ArchWiki

键盘映射控制台字体和控制台映射由 kbd 软件包(systemd 的依赖项)提供,该软件包还提供用于管理文本控制台的底层工具。此外,systemd 提供了 localectl(1) 工具,该工具可以控制系统 locale 和控制台以及 Xorg 的键盘布局设置。

查看键盘设置

使用 localectl status 查看当前的键盘配置。

键盘映射

keymap 文件存储在 /usr/share/kbd/keymaps/ 目录树中。一个键盘映射文件完整地描述了键盘布局,可能包含不同语言的符号,并且通过 AltGr_Lock keysym 用法模拟了布局切换

include 语句可以用于共享键盘映射文件的通用部分。在哪里查找 include 文件仅在 源代码 中进行了描述。

更多详情请参阅 keymaps(5)

列出键盘映射

控制台键盘映射的命名约定有些随意,但通常基于

  • 语言代码:其中语言代码与其国家代码相同(例如,de 代表德语,或 fr 代表法语)。
  • 国家代码:在不同国家/地区使用同一种语言的变体(例如,uk 代表英国英语,或 us 代表美国英语);国家代码列表也可以在 wikipedia:ISO 3166-1#Codes 中找到。
  • 键盘布局:其中布局与特定国家或语言无关(例如,dvorak 代表 Dvorak 键盘布局)。

要列出所有可用的键盘映射,请使用以下命令

$ localectl list-keymaps

要搜索键盘映射,请使用以下命令,将 search_term 替换为您的语言、国家/地区或布局的代码

$ localectl list-keymaps | grep -i search_term

或者,使用 find 命令

$ find /usr/share/kbd/keymaps/ -type f -name "*search_term*"

Loadkeys

可以仅为当前会话设置键盘映射。这对于测试不同的键盘映射、解决问题等非常有用。loadkeys 工具用于此目的

# loadkeys keymap

有关详细信息,请参阅 loadkeys(1)。当加载在 /etc/vconsole.conf 中配置的键盘映射时,systemd-vconsole-setup(8) 在内部使用相同的工具。

持久配置

持久键盘映射可以在 /etc/vconsole.conf 中设置,该文件在启动时由 systemd 读取。KEYMAP 变量用于指定键盘映射。如果变量为空或未设置,则默认使用 us 键盘映射。有关所有选项,请参阅 vconsole.conf(5)。例如

/etc/vconsole.conf
KEYMAP=uk

为了方便起见,可以使用 localectl 设置控制台键盘映射。它将更改 /etc/vconsole.conf 中的 KEYMAP 变量,并为当前会话设置键盘映射

# localectl set-keymap --no-convert keymap

可以使用 --no-convert 选项来防止 localectl 自动将 Xorg 键盘映射更改为最接近的匹配项。有关更多信息,请参阅 localectl(1)

如果需要,可以在早期用户空间中通过 keymap mkinitcpio 钩子加载 /etc/vconsole.conf 中的键盘映射。

提示
  • 如果您将自定义键盘映射保存在 /usr/share/kbd/keymaps/ 之外的其他位置,则必须在 vconsole.conf 中或使用上面的 localectl 命令时使用文件的完整路径来指定它。
  • /etc/vconsole.conf 中的 XKB* 变量用于 Xorg/键盘配置loadkeys 尚不支持使用它们;请参阅 kbd issue 72。Xorg 也不支持。

创建自定义键盘映射

使用控制台时,您可以使用热键来打印特定字符。此外,我们还可以打印字符序列和一些转义序列。因此,如果我们打印构成命令的字符序列,然后在后面添加一个换行转义字符,该命令将被执行。

一种方法是编辑键盘映射文件。但是,由于它会在所属软件包更新时被重写,因此不鼓励编辑此文件。最好将现有的键盘映射与个人键盘映射集成。loadkeys 实用程序可以做到这一点。

首先,创建一个键盘映射文件。此键盘映射文件可以位于任何位置,但一种方法是模仿 /usr/local 中的目录层次结构:创建 /usr/local/share/kbd/keymaps 目录,然后编辑 /usr/local/share/kbd/keymaps/personal.map

作为旁注,值得注意的是,这样的个人键盘映射对于重新定义默认键盘映射已经处理的键的行为也很有用:当使用 loadkeys 加载时,如果默认键盘映射中的指令与新指令冲突,则会被替换,否则会被保留。这样,只需在个人键盘映射中指定对键盘映射的更改即可。

提示
  • 您还可以编辑位于 /usr/share/kbd/keymaps/ 目录树中的现有键盘映射。键盘映射具有 .map.gz 扩展名,例如 us.map.gz 是美式键盘映射。只需将键盘映射复制到 /usr/local/share/kbd/keymaps/personal.map.gz 并使用 gunzip 解压缩即可。
  • 可以通过在 /etc/vconsole.conf 中设置自定义键盘映射来使其持久化。鉴于此,如果您使用 sd-vconsole mkinitcpio 钩子而不是 keymap,您可以将自定义键盘映射文件放在 /usr/share/kbd/keymaps/ 中。这样,来自 /usr/share/kbd/keymaps 的依赖项将由钩子自动添加到初始 ramdisk 映像中。另一方面,如果您将自定义键盘映射文件放在 /usr/local/ 下,则需要手动在 mkinitcpio.conf 中的 FILES 数组中指定其依赖项。

添加指令

此个人键盘映射中需要两种指令。首先是 keycode 指令,它与默认键盘映射中看到的格式相匹配。这些指令将键码与 keysym 关联起来。Keysym 代表键盘操作。可用的操作包括输出字符代码或字符序列、切换控制台或键盘映射、启动机器以及许多其他操作。可以使用以下命令获取完整的当前活动键盘映射

# dumpkeys -l

大多数 keysym 都是直观的。例如,要将键 112 设置为输出“e”,指令将是

keycode 112  = e

要将键 112 设置为输出欧元符号,指令将是

keycode 112 = euro

某些 keysym 并未立即连接到键盘操作。特别是,以大写字母 F 开头并后跟一位到三位数字(F1-F246)的 keysym,其数字大于 30 的始终是空闲的。这对于指示热键输出字符序列和其他操作非常有用

keycode 112 = F70

然后,可以将 F70 绑定到输出特定字符串

string F70 = "Hello"

当按下键 112 时,它将输出 F70 的内容。为了在终端中执行打印的命令,必须在命令字符串的末尾附加一个换行转义字符。例如,要使系统进入休眠状态,添加以下键盘映射

string F70 = "sudo systemctl hibernate\n"

其他示例

  • 要使 Right Alt 键与 Left Alt 键相同(对于 Emacs),请在您的键盘映射中使用以下行。它将包含文件 /usr/share/kbd/keymaps/i386/include/linux-with-two-alt-keys.inc,请检查它以了解详细信息。
include "linux-with-two-alt-keys"
  • 要将 CapsLock 与 Escape 交换(对于 Vim),请重新映射相应的键码
keycode 1 = Caps_Lock
keycode 58 = Escape
  • 要使 CapsLock 成为另一个 Control 键,请重新映射相应的键码
keycode 58 = Control
  • 要将 CapsLock 与 Left Control 键交换,请重新映射相应的键码
keycode 29 = Caps_Lock
keycode 58 = Control

保存更改

为了使用个人键盘映射,必须使用 loadkeys 加载它

# loadkeys /usr/local/share/kbd/keymaps/personal.map

但是,此键盘映射仅在当前会话中有效。为了在启动时加载键盘映射,请在 /etc/vconsole.conf 中的 KEYMAP 变量中指定文件的完整路径。该文件不必像 kbd 提供的官方键盘映射那样进行 gzip 压缩。

调整按键重复延迟和速率

按键重复延迟 指示需要按下并按住某个键多长时间(通常以毫秒为单位)才能开始重复过程。在触发重复过程后,字符将以 按键重复速率 指定的特定频率(通常以 Hz 为单位)重复。可以使用 kbdrate 命令更改这些值。请注意,这些设置是为控制台和 Xorg 单独配置的。

# kbdrate [-d delay] [-r rate]

例如,要将按键重复延迟设置为 200 毫秒,将按键重复速率设置为 30Hz,请使用以下命令

# kbdrate -d 200 -r 30

发出不指定延迟和速率的命令会将按键重复值重置为其各自的默认值;延迟为 250 毫秒,速率为 11Hz

# kbdrate

Systemd 服务

可以使用 systemd 服务来设置键盘速率。例如

/etc/systemd/system/kbdrate.service
[Unit]
Description=Keyboard repeat rate in tty.

[Service]
Type=oneshot
RemainAfterExit=yes
StandardInput=tty
StandardOutput=tty
ExecStart=/usr/bin/kbdrate --silent --delay 250 --rate 30

[Install]
WantedBy=multi-user.target

然后启动/启用 kbdrate.service systemd 服务。

布局切换

注意: 控制台上支持像 X11 上那样的通用布局切换。以下方法不适用于任意布局组合,尤其是某些主要布局根本不允许这样做

布局切换只能通过在更高层(通常是第 3 层,AltGr)上建立不同的布局来模拟。

要获取可能支持此功能的布局列表,请运行

$ find /usr/share/kbd/keymaps -exec zgrep -l 'AltGr_Lock' '{}' ';'

您可以通过将主布局和增强布局传递给 loadkeys 来测试这一点,例如

# loadkeys us mk

如果它有效,则第 3 层 Shift (AltGr) 将允许您访问第二个布局,AltGr_Lock(通常是 Alt+Shift,您将必须使用 zless 检查键盘映射文件)将提供有效的切换。

注意: 如果第二个布局仅打印方块,则这可能是 字体配置 问题。

对于持久配置,请在 /etc/vconsole.conf 中的 KEYMAP 旁边设置 KEYMAP_TOGGLE