Xorg/键盘配置
本文介绍了 Xorg 键盘配置的基础知识。有关键盘布局修改或附加按键映射等高级主题,请参阅 X 键盘扩展 或 额外的键盘按键。
Xorg 服务器使用 X 键盘扩展 (XKB) 来定义键盘布局。可选地,可以使用 xmodmap 直接访问内部键盘映射表,尽管不建议将其用于复杂的任务。此外,systemd 的 localectl 也可用于定义 Xorg 服务器和虚拟控制台的键盘布局。
查看键盘设置
您可以使用以下命令查看实际的 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、组合模式等。有关示例,请参阅 #常用 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
作为辅助布局、us
布局的 dvorak
变体以及用于在布局之间切换的 Super+Space
组合。有关更多详细信息,请参阅 xkeyboard-config(7)。
Keyboard - layout
。请参阅 Fcitx#输入法配置。IBus 用户如果使用 X 配置文件,则需要在首选项 -> 高级中启用“使用系统键盘布局”选项;如果使用 setxkbmap,则需要手动指定布局。使用 X 配置文件
xorg.conf
由 X 服务器在启动时解析。要应用更改,请重启 X。X 配置文件的语法在 Xorg#配置 中进行了解释。此方法创建系统范围的配置,该配置在重启后仍然有效。
这是一个示例
/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]]]
要设置 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
XKBLAYOUT
、XKBMODEL
、XKBVARIANT
和 XKBOPTIONS
将键盘配置写入 /etc/vconsole.conf
,[1] 但 Xorg 服务器不会从该文件中读取它们。使用 setxkbmap
setxkbmap 仅为当前的 X 会话设置键盘布局,但可以在 xinitrc 或 xprofile 中使其持久化。这会覆盖按照 #使用 X 配置文件 指定的系统范围的配置。
用法如下(请参阅 setxkbmap(1))
$ setxkbmap [-model xkb_model] [-layout xkb_layout] [-variant xkb_variant] [-option xkb_options]
-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
请注意,由于某些原因,必须在 Shift
之前按下 Alt
才能被 sxhkd 检测到。
使用 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
键开始一个按键序列,该序列涉及(通常是两个)额外的按键。用法通常用于输入键盘未设计的语言中的字符,或用于 AltGr
修饰符未涵盖的其他不太常用的字符。例如,按 Compose
'
e
会生成 é
,或者 Compose
-
-
-
将生成一个“长破折号”:—
。
虽然一些更奇特的键盘具有 Compose
键,但通常通过将已有的按键替换为它来获得其可用性。例如,要使 Menu
键成为 Compose
键,请使用 桌面环境 配置,或将 compose:menu
传递给 XkbOptions
(或 setxkbmap:setxkbmap -option compose:menu
)。允许的按键替换在 /usr/share/X11/xkb/rules/base.lst
中定义
$ grep "compose:" /usr/share/X11/xkb/rules/base.lst
如果在该文件中找不到所需的映射,则另一种方法是使用 xmodmap 将所需的按键映射到 Multi_key
键符,该键符默认充当组合键(请注意,xmodmap 设置由 setxkbmap 重置)。
按键组合
组合键的默认组合取决于为会话配置的 locale,并存储在 /usr/share/X11/locale/used_locale/Compose
中,其中 used_locale
例如是 en_US.UTF-8
。
您可以通过将默认文件复制到 ~/.XCompose
并对其进行编辑来定义自己的组合键组合。或者,创建一个空的 ~/.XCompose
并使用 include "%L"
包含默认文件,例如
~/.XCompose
include "%L" <Multi_key> <g> <a> : "α" <Multi_key> <g> <b> : "β" <Multi_key> <g> <g> : "γ"
组合键(在 ~/.XCompose
文件中表示为 <Multi_key>
)适用于数千个有效的 Unicode 字符中的任何一个,包括基本多文种平面之外的字符。请查看 Compose(5) 手册页,其中解释了 XCompose 文件的格式。
但是,GTK 默认不使用 XIM,因此不遵循 ~/.XCompose
按键。这可以通过配置 图形环境环境变量 GTK_IM_MODULE=xim
和/或 XMODIFIERS="@im=none"
来强制 GTK 使用 XIM 来解决。
Ctrl+Shift+u
组合插入 Unicode 字符。其他按键上的货币符号
大多数欧洲键盘在 5
键上印有欧元符号 (€)。例如,要使用 Alt+5
访问它,请使用 lv3:ralt_switch
和 eurosign:5
选项。
卢比符号 (₹) 可以通过 rupeesign:4
以相同的方式使用。
按下 Caps Lock 时立即切换状态
那些喜欢使用 Caps Lock 键输入大写字母的人可能会在 Caps Lock 状态切换时遇到短暂的延迟,从而导致出现两个或多个大写字母(例如 THe、ARch 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 毫秒,键盘重复速率设置为 30Hz,请使用以下命令
$ xset r rate 200 30
发出不指定延迟和速率的命令会将键盘重复值重置为其各自的默认值;延迟为 660 毫秒,速率为 25Hz
$ 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
的参数是毫秒级的 delay
和 interval
。如果您喜欢 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 服务器启动时使用以下选项将所需的设置传递给它
-ardelay milliseconds
- 设置自动重复延迟(按键必须按下的毫秒数,之后自动重复开始)。-arinterval milliseconds
- 设置自动重复间隔(自动重复生成的击键之间应经过的毫秒数)。
有关 X 服务器选项的完整列表,请参阅 Xserver(1),并参阅您的 显示管理器 以获取有关如何传递这些选项的信息。
参见
- Madduck 关于扩展 XKB 的指南(在 Wayback Machine 上存档)
- 如何在 Linux 中修改键盘布局 - Romano Giannetti 的博客