Xorg/键盘配置

出自 ArchWiki
(重定向自 Compose 键)

本文介绍了 Xorg 键盘配置的基础知识。有关键盘布局修改或附加按键映射等高级主题,请参阅 X 键盘扩展额外的键盘按键

Xorg 服务器使用 X 键盘扩展 (XKB) 来定义键盘布局。可选地,可以使用 xmodmap 直接访问内部键盘映射表,尽管不建议将其用于复杂任务。此外,systemdlocalectl 可用于定义 Xorg 服务器和虚拟控制台的键盘布局。

注意: XKB 选项可能会被某些桌面环境(如 GNOMEPlasma)提供的工具覆盖。

查看键盘设置

您可以使用以下命令查看实际的 XKB 设置

$ setxkbmap -print -verbose 10
Setting verbose level to 10
locale is C
Applied rules from evdev:
model:      evdev
layout:     us
options:    terminate:ctrl_alt_bksp
Trying to build keymap using the following components:
keycodes:   evdev+aliases(qwerty)
types:      complete
compat:     complete
symbols:    pc+us+inet(evdev)+terminate(ctrl_alt_bksp)
geometry:   pc(pc104)
xkb_keymap {
        xkb_keycodes  { include "evdev+aliases(qwerty)" };
        xkb_types     { include "complete"      };
        xkb_compat    { include "complete"      };
        xkb_symbols   { include "pc+us+inet(evdev)+terminate(ctrl_alt_bksp)"    };
        xkb_geometry  { include "pc(pc104)"     };
};

第三方实用程序

有一些“非官方”的实用程序允许打印有关当前使用的键盘布局的特定信息。

$ xkb-switch
us
$ xkblayout-state print "%s"
de

设置键盘布局

可以在 Xorg 中通过多种方式设置键盘布局。以下是对所用选项的说明

  • XkbModel 选择键盘型号。这仅对键盘可能具有的一些额外按键有影响。 安全的后备选项是 pc104 (ANSI) 或 pc105 (ISO)。 但例如,笔记本电脑通常有一些额外的按键,有时您可以通过简单地设置正确的型号来使其工作。
  • XkbLayout 选择键盘布局。 可以在逗号分隔的列表中指定多个布局,例如,如果您想在布局之间快速切换。
  • XkbVariant 选择 XkbLayout 可用的特定布局变体。 例如,默认的 sk(斯洛伐克语)变体是 qwertz,但您可以手动指定 qwerty 等。
  • XkbOptions 包含一些额外的选项(逗号分隔)。 用于指定布局切换、通知 LED、compose 模式等。 请参阅#常用 XKB 选项部分以获取示例。
注意: 您必须指定与指定布局数量一样多的变体。 如果您想要默认变体,请将空字符串指定为变体(逗号必须保留)。 例如,要将默认的 us 布局作为主布局,并将 us 布局的 dvorak 变体作为辅助布局,请将 us,us 指定为 XkbLayout,将 ,dvorak 指定为 XkbVariant

布局名称通常是2 字母国家代码。 要查看键盘型号、布局、变体和选项的完整列表以及简短描述,请打开 /usr/share/X11/xkb/rules/base.lst。 或者,您可以使用以下命令之一查看没有描述的列表

  • localectl list-x11-keymap-models
  • localectl list-x11-keymap-layouts
  • localectl list-x11-keymap-variants [layout]
  • localectl list-x11-keymap-options

以下小节中的示例将具有相同的效果,它们将设置 pc104 型号,cz 作为主布局,us 作为辅助布局,dvorak 变体用于 us 布局,以及 Super+Space 组合用于在布局之间切换。 有关更多详细信息,请参阅 xkeyboard-config(7)

注意: Fcitx/IBus 用户可能会发现这些方法不起作用,或者只是暂时起作用,因为它们会尝试控制键盘布局。 Fcitx 用户需要将第一个输入法设置为 Keyboard - layout。 请参阅 Fcitx#输入法配置。 如果使用 X 配置文件,IBus 用户需要在“首选项”->“高级”中启用“使用系统键盘布局”选项;如果使用 setxkbmap,则需要手动指定布局。

使用 X 配置文件

注意: xorg.conf 在 X 服务器启动时被解析。 要应用更改,请重启 X。

Xorg#配置 中解释了 X 配置文件的语法。 此方法创建系统范围的配置,该配置在重启后仍然有效。

这是一个例子

/etc/X11/xorg.conf.d/00-keyboard.conf
Section "InputClass"
        Identifier "system-keyboard"
        MatchIsKeyboard "on"
        Option "XkbLayout" "cz,us"
        Option "XkbModel" "pc104"
        Option "XkbVariant" ",dvorak"
        Option "XkbOptions" "grp:win_space_toggle"
EndSection

使用 localectl

为了方便起见,可以使用工具 localectl 代替手动编辑 X 配置文件。 它会将配置保存在 /etc/X11/xorg.conf.d/00-keyboard.conf 中,不应手动编辑此文件,因为 localectl 会在下次启动时覆盖更改。

用法如下

# localectl [--no-convert] set-x11-keymap layout [model [variant [options]]]

要设置型号变体选项,需要指定所有前面的字段,但可以通过使用 "" 传递空字符串来跳过前面的字段。 除非传递 --no-convert 选项,否则指定的键盘映射也会转换为最接近的控制台键盘映射,并应用于 vconsole.conf 中的控制台配置。 有关更多信息,请参阅 localectl(1)

要创建类似上述内容的 /etc/X11/xorg.conf.d/00-keyboard.conf

# localectl --no-convert set-x11-keymap cz,us pc104 ,dvorak grp:win_space_toggle
提示: localectl 还会使用变量 XKBLAYOUTXKBMODELXKBVARIANTXKBOPTIONS 将键盘配置写入 /etc/vconsole.conf[1],但 Xorg 服务器不会从该文件中读取它们。

使用 setxkbmap

此条目或章节需要扩充。

原因: Udev 也发挥作用(例如,当插入键盘时),撤消 setxkbmap 的更改(在 Talk:Xorg/Keyboard configuration#Persisting layout when USB keyboard connected 中讨论)

setxkbmap 仅为当前 X 会话设置键盘布局,但可以在 xinitrcxprofile 中使其持久化。 这会覆盖遵循 #使用 X 配置文件 指定的系统范围配置。

用法如下(参见 setxkbmap(1)

$ setxkbmap [-model xkb_model] [-layout xkb_layout] [-variant xkb_variant] [-option xkb_options]
注意: setxkbmap 将命令行中指定的选项添加到之前设置的选项(保存在根窗口属性中)。 如果要替换所有先前指定的选项,请先使用带有空参数的 -option 标志。

要仅更改布局(-layout 是默认标志)

$ setxkbmap xkb_layout

对于多项自定义

$ setxkbmap -model pc104 -layout cz,us -variant ,dvorak -option grp:win_space_toggle

常用 XKB 选项

在键盘布局之间切换

为了能够轻松切换键盘布局,首先指定您想要切换的多个布局(第一个是默认布局)。 然后指定一个按键(或按键组合),它将用于切换。 例如,要使用 CapsLock 键在美国和瑞典布局之间切换,请使用 us,se 作为 XkbLayout 的参数,使用 grp:caps_toggle 作为 XkbOptions 的参数。 XkbLayout 的数量应与 XkbVariant 的数量相匹配 — 如果您只想在不同的变体之间切换,则相应地复制布局(例如 de,de)。

可在 xkeyboard-config(7) § LAYOUTS 中找到可用布局(和变体)的列表。 可用于布局切换的按键组合在 xkeyboard-config(7) § Switching to another layout 中列出。

请注意,grp:alts_toggle 选项不可靠,并且不太可能修复; 请优先考虑其他组合。

使用 Alt Shift 切换语言

要将 Alt+Shift 设置为布局快捷键,请在 XkbOptions 中使用 grp:alt_shift_toggle

但是,XKB 存在一个已知问题,会导致 Alt+Shift+任意键 类型的其他快捷方式中断。 此外,XKB 可能会在某些键盘布局中默认将右 Alt 设置为 AltGr,从而导致 RAlt+RShift 无法用于布局切换。

作为一种解决方法,可以使用 sxhkd 通过将以下内容添加到 sxhkdrc 来切换布局

Shift_L + Alt_L
    setxkbmap -query | grep -q 'fr' && setxkbmap us || setxkbmap fr,us
Shift_R + Alt_R
    setxkbmap -query | grep -q 'fr' && setxkbmap us || setxkbmap fr,us

请注意,由于某种原因,必须先按下 Alt,然后才能被 sxhkd 检测到 Shift

使用 Ctrl+Alt+Backspace 终止 Xorg

默认情况下,按键组合 Ctrl+Alt+Backspace 处于禁用状态。 您可以通过将 terminate:ctrl_alt_bksp 传递给 XkbOptions 来启用它。 也可以通过在 xmodmap 中将按键绑定到 Terminate_Server 来完成此操作(这将撤消任何现有的 XkbOptions 设置)。 为了使这两种方法中的任何一种起作用,还需要在 ServerFlags 中将 DontZap 设置为“off”:自 2004 年以来,[2] 这是默认设置。

交换 Caps Lock 和左 Ctrl

要交换 Caps Lock 和左 Ctrl 键,请将 ctrl:swapcaps 添加到 XkbOptions。 运行以下命令以查看类似的选项及其描述

$ grep -E "(ctrl|caps):" /usr/share/X11/xkb/rules/base.lst

启用鼠标键

鼠标键,不要与鼠标的按键混淆,默认情况下处于禁用状态,必须通过将 keypad:pointerkeys 传递给 XkbOptions 来手动启用。 这将使 Shift+NumLock 快捷方式切换鼠标键。

另请参阅 X 键盘扩展#鼠标控制 以获取高级配置。

配置 AltGr

AltGr (Alternate Graphic) 键可用于访问键盘上的其他字符和符号。 它的功能类似于 Shift 的修饰键,但可以访问第三级按键映射。 请注意,映射级别的工作方式如下

  • 一级:按键的默认层(无修饰符)。
  • 二级:通过按下 Shift 键访问,提供辅助字符(例如大写)或符号(例如 @ 符号)。
  • 三级:通过按下 AltGr 键访问,允许访问一级和二级上不可用的其他字符或符号。

二级字符通常印在键盘按键上,并且很容易找到。 另一方面,要检查其他级别上的字符,您可以使用 xmodmap -pk 或在 /usr/share/X11/xkb/symbols 上查找您的键盘映射。

配置 Compose 键

虽然传统键盘上通常没有,但可以将 Compose 键 配置为现有按键。

Compose 键开始一个按键序列,该序列涉及(通常是两个)额外的按键。 用途通常是输入键盘并非为之设计的语言中的字符,或者输入 AltGr 修饰符未涵盖的其他较少使用的字符。 例如,按 Compose ' e 会生成 é,或者 Compose - - - 将生成“长破折号”:

虽然一些更独特的键盘具有 Compose 键,但通常可以通过将现有按键替换为它来获得其可用性。 例如,要使 Menu 键成为 Compose 键,请使用桌面环境配置,或将 compose:menu 传递给 XkbOptions(或 setxkbmapsetxkbmap -option compose:menu)。 允许的按键替换在 /usr/share/X11/xkb/rules/base.lst 中定义

$ grep "compose:" /usr/share/X11/xkb/rules/base.lst

如果在该文件中找不到所需的映射,另一种方法是使用 xmodmap 将所需的按键映射到 Multi_key 键符号,后者默认充当 compose 键(请注意,xmodmap 设置会被 setxkbmap 重置)。

按键组合

compose 键的默认组合取决于为会话配置的区域设置,并存储在 /usr/share/X11/locale/used_locale/Compose 中,其中 used_locale 例如为 en_US.UTF-8

您可以通过将默认文件复制到 ~/.XCompose 并对其进行编辑来定义自己的 compose 键组合。 或者,创建一个空的 ~/.XCompose 并使用 include "%L" 包含默认文件,例如

~/.XCompose
include "%L"

<Multi_key> <g> <a> : "α"
<Multi_key> <g> <b> : "β"
<Multi_key> <g> <g> : "γ"

compose 键(在 ~/.XCompose 文件中表示为 <Multi_key>)适用于数千个有效的 Unicode 字符中的任何一个,包括基本多文种平面之外的字符。 请查看 Compose(5) 手册页,它解释了 XCompose 文件的格式。

但是,GTK 默认不使用 XIM,因此不遵循 ~/.XCompose 键。 这可以通过强制 GTK 使用 XIM 来修复,方法是配置图形环境变量 GTK_IM_MODULE=xim 和/或 XMODIFIERS="@im=none"

提示: XIM 非常旧,您可能会使用其他输入法(如 IBusFcitx5)获得更好的效果; 有关详细信息,请参阅 输入法
注意: XIM 将阻止使用 Ctrl+Shift+u 组合插入 Unicode 字符。

其他键上的货币符号

大多数欧洲键盘在 5 键上印有欧元符号 (€)。 例如,要使用 Alt+5 访问它,请使用 lv3:ralt_switcheurosign:5 选项。

卢比符号 (₹) 可以使用 rupeesign:4 以相同的方式使用。

按下 Caps Lock 时立即切换状态

那些喜欢使用 Caps Lock 键键入大写字母的人在切换 Caps Lock 状态时可能会遇到短暂的延迟,从而导致出现两个或多个大写字母(例如 THeARch LInux)。 发生这种情况是因为 Caps Lock 在按下 Caps Lock 键后立即启用,但仅在释放第二次按键时才禁用。 这种行为源于打字机,在打字机中,Caps Lock 功能是通过物理锁定移位的字杆来实现的,而释放 shift 按键的操作是导致释放锁定的操作。

一些更流行的操作系统已删除了此行为,无论是自愿的(因为它可能会使某些人感到困惑)还是错误地删除的,但这只是一个偏好问题。 已在 Xserver 错误跟踪器上提交了错误报告,因为目前没有简单的方法可以切换到其他操作系统反映的行为。 对于任何想要跟进该问题的人,可以在 [3][4] 中找到错误报告和最新的工作进展。

解决方法

首先,将您的键盘配置导出到文件

$ xkbcomp -xkb $DISPLAY xkbmap

在文件 xkbmap 中,找到以 key <CAPS> 开头的 Caps Lock 部分

 key <CAPS> {         [       Caps_Lock ] };

并将整个部分替换为以下代码

key <CAPS> {
    repeat=no,
    type[group1]="ALPHABETIC",
    symbols[group1]=[ Caps_Lock, Caps_Lock],
    actions[group1]=[ LockMods(modifiers=Lock), Private(type=3,data[0]=1,data[1]=3,data[2]=3)]
};

保存并重新加载键盘配置

$ xkbcomp -w 0 xkbmap $DISPLAY

考虑将其设为在 X 启动后启动的服务,因为重新加载的配置在系统重启后不会保留。

一键按键功能

要为修饰键分配额外的单次点击功能,您可以使用 xcape。 例如,CapsLock 可以设置为在单独按下时充当 Escape,而在与另一个按键一起使用时充当 Control。 首先使用 setxkbmap 设置 Control 交换,如前所述,并使用 xcape 设置 Escape 关联

$ xcape -e 'Caps_Lock=Escape'

您可以设置多个关联,用分号分隔,例如:Caps_Lock=Escape;Shift_L=Escape

如果您按住按键的时间超过超时值(默认 500 毫秒),xcape 将不会生成按键事件。

调整键盘重复延迟和速率

键盘重复延迟指示按键需要按住多长时间(通常以毫秒为单位)才能开始重复过程。 在重复过程被触发后,字符将以由键盘重复速率指定的特定频率(通常以 Hz 为单位)重复。 请注意,这些设置是为 Xorg 和 虚拟控制台 分别配置的。

使用 xset

工具 xset(由 xorg-xset 提供)可用于为活动的 X 服务器设置键盘重复延迟和速率,但运行时期间的某些操作可能会导致 X 服务器重置这些更改,并恢复为其座位默认值

用法

$ xset r rate delay [rate]

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

$ xset r rate 200 30

发出不指定延迟和速率的命令会将键盘重复值重置为其各自的默认值; 延迟为 660 毫秒,速率为 25 赫兹

$ xset r rate

使用 xautocfg

xautocfgAUR 可以自动为新连接的设备应用重复速率设置。 它监视 X11 事件并将重复速率配置应用于新连接的键盘。

调整配置

~/.config/xautocfg.cfg
[keyboard]

# repeat delay in ms
delay = 200

# repeat rate in Hz
rate = 30

如果您的窗口管理器或桌面环境启动了 graphical-session.target,请启用 systemd/User xautocfg.service。 或者,手动启动 xautocfg

使用 AutoRepeat 配置选项

要持久化系统范围的配置,请使用 Xorg 配置文件更改座位默认值,如 #使用 X 配置文件 中所述,并添加 AutoRepeat 部分条目:[5]

AutoRepeat 的参数是毫秒为单位的 delayinterval。 如果您喜欢 xset 的 25 Hz rate,则相应的 interval 为 1000 / 25 = 40 毫秒。

/etc/X11/xorg.conf.d/00-keyboard.conf
Section "InputClass"
        ...
        Option "AutoRepeat" "200 40"
        ...
EndSection

使用 XServer 启动选项

持久化配置的另一种方法是在 X 服务器启动时使用以下选项将所需的设置传递给 X 服务器

  • -ardelay milliseconds - 设置自动重复延迟(按键必须按下多长时间(以毫秒为单位)后自动重复开始)。
  • -arinterval milliseconds - 设置自动重复间隔(自动重复生成的击键之间应经过的时间长度,以毫秒为单位)。

有关 X 服务器选项的完整列表,请参阅 Xserver(1),并参考您的 显示管理器 以获取有关如何传递这些选项的信息。

参见