Linux 控制台/键盘配置
键盘映射、控制台字体和控制台映射由 kbd 包提供(systemd 的一个依赖项),该包还提供用于管理文本控制台的低级工具。此外,systemd 还提供了 localectl(1) 工具,该工具可以控制系统 区域设置 和控制台及 Xorg 的键盘布局设置。
查看键盘设置
使用 localectl status 查看当前的键盘配置。
键盘布局 (Keymaps)
keymap 文件存储在 /usr/share/kbd/keymaps/ 目录树中。键映射文件完整描述了键盘布局,可能包含不同语言的符号,以及通过使用 AltGr_Lock keysym 模拟的 布局切换。
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 hook 加载 /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中设置KEYMAP来使自定义键映射持久化。鉴于此,如果您使用sd-vconsolemkinitcpio hook 而不是keymap,则可以将自定义键映射文件放在/usr/share/kbd/keymaps/中。这样,它的/usr/share/kbd/keymaps中的依赖项将被 hook 自动添加到初始内存盘镜像中。另一方面,如果您将自定义键映射文件放在/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"
其他示例
- 要使右 Alt 键与左 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 和左 Control 键,请重新映射相应的键码
keycode 29 = Caps_Lock keycode 58 = Control
保存更改
为了使用个人键映射,必须使用 loadkeys 加载它
# loadkeys /usr/local/share/kbd/keymaps/personal.map
但是此键映射仅对当前会话有效。为了在启动时加载键映射,请在 /etc/vconsole.conf 的 KEYMAP 变量中指定文件的完整路径。文件不必是 gzipped 格式,就像 kbd 提供的官方键映射一样。
调整按键重复延迟和速率
按键重复延迟 指示按住一个键才能开始重复过程所需的时间(通常以毫秒为单位)。触发重复过程后,字符将以 按键重复速率 指定的频率(通常以 Hz 为单位)重复。这些值可以使用 kbdrate 命令进行更改。请注意,这些设置是为控制台和 Xorg 分别配置的。
# kbdrate [-d delay] [-r rate]
例如,要将按键重复延迟设置为 200ms,将按键重复速率设置为 30Hz,请使用以下命令
# kbdrate -d 200 -r 30
不指定延迟和速率而发出命令将把按键重复值重置为各自的默认值;延迟为 250ms,速率为 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 服务。
布局切换
布局切换只能通过在较高的层(通常是第 3 层,AltGr)上建立不同的布局来模拟。
要获取可能支持此功能的布局列表,请运行
$ find /usr/share/kbd/keymaps -exec zgrep -l 'AltGr_Lock' '{}' ';'
您可以尝试通过将主布局和增强布局传递给 loadkeys 来进行测试,例如
# loadkeys us mk
如果成功,第 3 层移位(AltGr)将允许您访问第二个布局,AltGr_Lock(通常是 Alt+Shift,您需要使用 zless 检查键映射文件)将提供有效的切换。
对于永久配置,请在 /etc/vconsole.conf 中设置 KEYMAP_TOGGLE,紧跟在 KEYMAP 之后。