Linux 控制台/键盘配置

来自 Arch Linux 中文维基

用于 Linux 控制台的键盘映射(keymaps)、控制台字体和控制台映射由 kbd 包(systemd 的依赖)提供,它还提供了许多管理文本控制台的低级工具。此外,systemd 还提供了 localectl 工具,可以控制控制台和 Xorg 的系统区域和键盘布局设置。

查看键盘设置[编辑 | 编辑源代码]

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

键盘映射[编辑 | 编辑源代码]

键盘映射文件存储在 /usr/share/kbd/keymaps/ 目录树中。通常一个键盘映射文件对应一个键盘布局(include 语句可用于共享通用的部分,一个键盘映射文件可以包含多个布局,其中一些按键组合用于切换)。更多细节请参见 keymaps(5)

列出键盘映射[编辑 | 编辑源代码]

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

使用以下命令查看可用键盘映射的列表:

$ 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 工具用于此目的,它由 systemd 在加载 /etc/vconsole.conf 中配置的键盘映射时在内部使用。用法很简单:

# loadkeys 键盘映射

详情请参阅 loadkeys(1)

持久化设置[编辑 | 编辑源代码]

持久键盘映射可以在/etc/vconsole.conf中设置,systemd 可以在启动时加载。 KEYMAP 变量来明确定义键盘映射。如果此变量是空的或没有设置, us键盘映射作为默认值。参见 vconsole.conf(5) 详细设置。 例如:

/etc/vconsole.conf
KEYMAP=uk
...

localectl 可以方便设置终端键盘映射。既可以改变在/etc/vconsole.confKEYMAP 变量值也可以为当前会话设置临时值。

# localectl set-keymap --no-convert keymap
--no-convert 选项可以阻止 localectl 自动的安装最近似的适配改变 Xorg keymap (不会影响xwindows下键盘布局)。参见 localectl(1) 获得更多细节。

如果有需求,可以在早期用户空间时,使用 keymap 钩子从 /etc/vconsole.conf 设置中读取键盘映射 mkinitcpio hook

提示:如果将自定义的键盘映射保存在 /usr/share/kbd/keymaps/ 以外的目录中,在设置vconsole.conf或使用上面提到的 localectl命令时使用完整的绝对路径。

创建自定义键盘映射[编辑 | 编辑源代码]

当使用终端时,你可以使用热键输出特殊字符。然而我们还可以输出一系列字符和一些转义字符。如果我们输出一系列字符组成命令,之后转义字符换一个新行,这个命令将被执行。

编辑键盘映射文件可以实现上述方法。但是,由于更新系统原因键盘映射文件会被重写,不鼓励编辑上述键盘映射文件。一个更好的解决方案时整合现存的键盘映射文件和个人设置的键盘映射文件,loadkeys 命令工具可以做到这一点。

首先,创建一个键盘映射文件,这个键盘映射文件可以存放在任何地方,但是推荐的方法是在/usr/local: create里面模拟目录结构:创建/usr/usr/local/share/kbd/keymaps目录,编辑edit /usr/local/share/kbd/keymaps/personal.map文件。

PS:值得注意的是,这样的个人键盘映射文件对于重新定义已经是默认的键盘映射的按键行为也非常有用:当使用loadkeys 指令时,默认的键盘映射和新的指令相冲突时,默认键盘映射被取代,反之则保留。这种方法仅仅会改变在个人键盘映射里面必须被改变的键盘映射。

提示:
  • 你也可以编辑一个现存的键盘映射,它在/usr/share/kbd/keymaps/ 目录里面。键盘映射文件的扩展名是.map.gz,比如 us.map.gz 是美国键盘映射。复制这个键盘映射到 /usr/local/share/kbd/keymaps/personal.map.gz 并且使用gunzip解压缩之。
  • 通过设置 /etc/vconsole.conf 文件自定义的个人键盘映射可以持久化。鉴于此,如果你在mkinitcpio hook中使用的sd-vconsole 来代替 keymap,你应该把你的自定义键盘映射文件放入/usr/share/kbd/keymaps/中。这种方法它的来自 /usr/share/kbd/keymaps的依赖关系会被钩子自动的加载到初始内存镜像中去。另一方面,如果你把自定义的键盘映射放在了 /usr/local/ 下,它的依赖需要在 mkinitcpio.conf 文件中 FILES 行手工明确加载。


增加映射命令[编辑 | 编辑源代码]

个人键盘映射包括2种指令。首先,keycode 命令,这和默认键盘映射看到的格式相匹配。这指令把 keycode 和 keysym 联系在一起。keysyms 代表键盘的动作。这个可用的动作包括:输出字符码或转义字符,切换终端和键盘映射,启动机器等许多其他动作。全部的当前活动的键盘映射可以从以下命令获得:

# dumpkeys -l

大部分的键盘动作都很直观。例如,设置 112键输出“e”,这个命令是:

keycode 112  = e

设置112输出 euro符号,这个命令是:

keycode 112 = euro

一些键盘动作不能立即和某个键盘按键联系起来。尤其是键盘动作前缀是大写的F后面是1-3位数字,F1-F246构成大于30的总是空白的。定义一个热键输出一系列字符或其他动作是非常有用:

keycode 112 = F70

此时F70可以绑定输出特定的字符串:

string F70 = "Hello"

当112键被按下时,会输出F70的内容。为了在终端执行可以输出的命令,换行符必须附加到命令字符串的后面。例如:输出系统休眠命令enter a system into hibernation ,加入下面的键盘映射。

string F70 = "sudo systemctl hibernate\n"

其他例子[编辑 | 编辑源代码]

  • 对于 emacs 用右侧的 Alt 行使和左侧 Alt 同样的功能,用下面的命令在你的键盘映射里。它将会包含 /usr/share/kbd/keymaps/i386/include/linux-with-two-alt-keys.inc ,可以查看它的实现细节。
include "linux-with-two-alt-keys"
  • 切换 Caps_lock 和 Escape 键(为vim),重新映射相应的 keycodes。
keycode 1 = Caps_Lock
keycode 58 = Escape
  • 切换 Caps_lock 作为额外的 Control 键,重新映射相应的 keycodes。
keycode 58 = Control
  • 互换 Caps_lock 和左侧 Control 键,重新映射相应的 keycodes。
keycode 29 = Caps_Lock
keycode 58 = Control

储存更改[编辑 | 编辑源代码]

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

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

然而,这个键盘映射只能在当前会话被激活。为了在启动时使用这个键盘映射,需要在 /etc/vconsole.conf 中设置KEYMAP ,并且明确写出个人键盘映射文件绝对路径。这个文件不必想被 kbd 提供的官方的键盘映射一样使用gunzip压缩。

KEYMAP=/usr/local/share/kbd/keymaps/personal.map

修改按键延时和重复频率[编辑 | 编辑源代码]

按键延时是只长按一个按键多少时间(通常以毫秒为单位)才会开始重复这个按键。开始重复过程后,字符会以一定频率重复(通常以赫兹单位),也就是重复频率。这些值可以通过 kbdrate 设置。请注意,这些设置需要为控制台和 Xorg 分别配置。

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

例如,要将延时设置为 200 毫秒,将重复频率设置为 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 服务。