xmodmap
xmodmap 是一个用于修改 Xorg 中的键盘映射和指针按钮映射的实用程序。
xmodmap 与 X 键盘扩展 (XKB) 没有直接关系,因为它使用了关于如何在 X 中处理键码的不同(pre-XKB)思想。一般来说,它仅推荐用于最简单的任务。有关高级布局配置,请参阅 X 键盘扩展。
- xmodmap 设置会被 setxkbmap 重置,setxkbmap 不仅会将字母数字键更改为映射中给出的值,还会将所有其他键重置为启动默认值(请参阅 LQWiki:Configuring keyboards)。
- 由于 Xorg 的限制,xmodmap 设置不会自动应用于热插拔设备。如果在应用自定义表后将键盘添加到系统,则必须再次应用自定义表。 [1]
简介
在 Xorg 中有两种类型的键盘值:键码 和 keysyms。
- 键码 (keycode)
- 键码是当按下按键或鼠标按钮时内核接收到的数字表示。
- keysym
- keysym 是分配给键码的值。例如,按下
a
会生成键码 38
,它被映射到keysym 0x61
,这与 ASCII 表 中的a
匹配。 - keysyms 由 Xorg 在定义键码-keysym 关系的键码表中管理,这被称为键盘映射表。这可以通过运行
xmodmap
来显示。
安装
xmodmap 可以通过 xorg-xmodmap 软件包安装。
可选地,安装 xkeycaps,它是 xmodmap 的图形前端。
键盘映射表
打印当前键盘映射表,格式化为表达式
$ xmodmap -pke
[...] keycode 57 = n N [...]
每个键码后面都跟着它映射到的 keysym。上面的例子表明键码 57
映射到小写字母 n
,而大写字母 N
映射到键码 57
加上 Shift
键。
表中的每个 keysym 列对应于修饰键的特定组合
Key
Shift+Key
Mode_switch+Key
Mode_switch+Shift+Key
ISO_Level3_Shift+Key
ISO_Level3_Shift+Shift+Key
并非所有 keysyms 都必须设置,但要仅分配后面的 keysym,请使用 NoSymbol
值。
要查看哪个键码对应于某个按键,请参阅 键盘输入#在 Xorg 中识别键码,了解关于 xev 实用程序的详细信息,当您按下按键时,它将输出关于按键的相关键码/keysym 信息。
XF86AudioMute
或 XF86Mail
。这些 keysyms 可以在 /usr/include/X11/XF86keysym.h
中找到。许多多媒体程序被设计为可以直接使用这些 keysyms,而无需配置任何第三方应用程序。请注意,xmodmap 受 xkbd 设置的影响,因此所有八个 keysym 都可用于 US(intl) xkbd 布局,但不可用于默认 US 布局(它缺少 level3 中定义的 ralt_switch 符号)。要使所有 8 个 keysyms 可用,您应该配置键盘的 (intl) 变体。以 US 布局为例,在调用 xmodmap 之前先使用 $ setxkbmap -layout 'us(intl)'
来测试您在当前 X 会话中的更改。要永久进行此更改,请编辑 xorg 配置文件或您的 .xprofile 或 .xinitrc 文件。有关完整说明,请参阅 Xorg/键盘配置#设置键盘布局。
自定义表
要创建键盘映射(即 ~/.Xmodmap
)
$ xmodmap -pke > ~/.Xmodmap
要测试更改
$ xmodmap ~/.Xmodmap
激活自定义表
使用 GDM、XDM 或 LightDM,无需 source ~/.Xmodmap
。对于 startx,请使用
~/.xinitrc
[[ -f ~/.Xmodmap ]] && xmodmap ~/.Xmodmap
或者,编辑全局启动脚本 /etc/X11/xinit/xinitrc
。
测试更改
进行临时更改
$ xmodmap -e "keycode 46 = l L l L lstroke Lstroke lstroke" $ xmodmap -e "keysym a = e E"
修饰键
xmodmap 也可以用于覆盖修饰键,例如交换 Control
和 Super
(Windows 键)。
详细打印当前修饰符表(完整示例)
$ xmodmap -pm
xmodmap: up to 4 keys per modifier, (keycodes in parentheses): shift Shift_L (0x32), Shift_R (0x3e) lock Caps_Lock (0x42) control Control_L (0x25), Control_R (0x69) mod1 Alt_L (0x40), Meta_L (0xcd) mod2 Num_Lock (0x94) mod3 mod4 Super_R (0x86), Super_L (0xce), Hyper_L (0xcf) mod5 ISO_Level3_Shift (0x5c), ISO_Level3_Shift (0x6c), Mode_switch (0x85), Mode_switch (0xcb)
查找 keysym 列修饰键
- ISO_Level3_Shift
- 非美国键盘上的 AltGr 键调用修饰键 ISO_Level3_Shift。(在美国键盘上,右 alt 键
Alt_R
与左 alt 键Alt_L
具有相同的功能,这使得将布局设置为美国国际键盘是更可取的。请参阅 #键盘映射表。) - Mode_switch
- Mode_switch 修饰符默认可能映射到您的键盘上没有的按键。
重新分配修饰键到键盘上的按键
Mode_Switch
而不是正确的 Mode_switch
将会导致错误。在分配之前,需要清除修饰键。这适用于您打算分配的修饰键和您打算使用的按键上的修饰键。例如,如果您打算将 Caps_Lock
分配给您的 A 键,并将 B
分配给您的 NumLock 键,您需要首先清除 Caps_Lock
和 Num_Lock
的修饰符,然后分配 keysyms,最后添加回修饰符。
~/.Xmodmap
[...] clear lock clear mod2 keycode 38 = Caps_Lock keycode 77 = Num_Lock add lock = Caps_Lock add mod2 = Num_Lock
!
是注释,因此在以下示例中仅清除修饰符 Control
和 Mod4
。然后将 keysyms Control_L
、Control_R
、Super_L
和 Super_R
分配给相反的修饰符。将左右都分配给相同的修饰符意味着这两个键的处理方式相同。
~/.Xmodmap
[...] !clear Shift !clear Lock clear Control !clear Mod1 !clear Mod2 !clear Mod3 clear Mod4 !clear Mod5 !add Shift = Shift_L Shift_R !add Lock = Caps_Lock add Control = Super_L Super_R !add Mod1 = Alt_L Alt_R !add Mod2 = Mode_switch !add Mod3 = add Mod4 = Control_L Control_R !add Mod5 =
Control_L
和 Control_R
keysyms 已分配给 Control
修饰符,而 Super_L
和 Super_R
keysyms 已分配给 Mod4
修饰符。如果您收到以下错误消息 X Error of failed request: BadValue (integer parameter out of range for operation)
,您将需要相应地进行调整。运行 xmodmap
会生成修饰符及其分配的键的列表。以下示例将 CapsLock
修改为 Control
,并将 Shift+CapsLock
修改为 CapsLock
~/.Xmodmap
clear lock clear control add control = Caps_Lock Control_L Control_R keycode 66 = Control_L Caps_Lock NoSymbol NoSymbol
Compose 键
Compose 键 用于创建键盘上可能无法直接访问的特殊字符和符号。这对于输入非英语语言的重音字母尤其有用。例如,连续按下 Compose
e
'
将产生 é。某些字符需要按下 Compose
后再按 2 个以上的键。通常,选择的修饰键会映射到 Compose
。Compose 键可以在大多数桌面环境的 GUI 设置中设置,但如果使用本文中描述的自定义键盘映射表,这些选项将不起作用。要使用 Xmodmap
设置 Compose 键,请使用 Multi_key
标识符。例如,要将右 alt 键 (AltGr
) 映射到 Compose 键
~/.Xmodmap
[...] keycode 108 = Multi_key Alt_R Meta_R Alt_R Meta_R
键码编号可能因键盘型号而异。
反向滚动
OS X Lion 中提供的自然滚动功能(模仿智能手机或平板电脑滚动)可以使用 xmodmap 复制。由于 synaptics 驱动程序使用按钮 4/5/6/7 进行向上/向下/向左/向右滚动,您只需交换 ~/.Xmodmap
中声明按钮的顺序即可
~/.Xmodmap
pointer = 1 2 3 5 4 7 6 8 9 10 11 12
然后更新 xmodmap
$ xmodmap ~/.Xmodmap
交换鼠标按键
在 synaptics 驱动程序中,鼠标左键、中键和右键分别对应于按钮 1、2 和 3。要交换鼠标左右键,同样只需反转它们在 ~/.Xmodmap
中列出的顺序
~/.Xmodmap
pointer = 3 2 1
对于简单的鼠标设置,这应该足够了。再次更新 xmodmap
$ xmodmap ~/.Xmodmap
模板
西班牙语
~/.Xmodmap
keycode 24 = a A aacute Aacute ae AE ae keycode 26 = e E eacute Eacute EuroSign cent EuroSign keycode 30 = u U uacute Uacute downarrow uparrow downarrow keycode 31 = i I iacute Iacute rightarrow idotless rightarrow keycode 32 = o O oacute Oacute oslash Oslash oslash keycode 57 = n N ntilde Ntilde n N n keycode 58 = comma question comma questiondown dead_acute dead_doubleacute dead_acute keycode 61 = exclam section exclamdown section dead_belowdot dead_abovedot dead_belowdot !Maps the Mode key to the Alt key keycode 64 = Mode_switch
世界语
~/.Xmodmap
keycode 54 = c C c C ccircumflex Ccircumflex keycode 42 = g G g G gcircumflex Gcircumflex keycode 43 = h H h H hcircumflex Hcircumflex keycode 44 = j J j J jcircumflex Jcircumflex keycode 39 = s S s S scircumflex Scircumflex keycode 30 = u U u U ubreve Ubreve
将 CapsLock 键变为 Control 键
将 CapsLock
变为 Control
的最简单示例。
~/.Xmodmap
clear lock clear control keycode 66 = Control_L add control = Control_L Control_R
将 CapsLock 键变为 Control 键,并将 LeftControl 键变为 Hyper 键
笔记本电脑用户可能更喜欢将 CapsLock
作为 Control
键。Left Control
键可以用作 Hyper
修饰符(emacs、openbox 或 i3 的附加修饰符)。
~/.Xmodmap
clear lock clear control clear mod1 clear mod2 clear mod3 clear mod4 clear mod5 keycode 37 = Hyper_L keycode 66 = Control_L add control = Control_L Control_R add mod1 = Alt_L Alt_R Meta_L add mod2 = Num_Lock add mod3 = Hyper_L add mod4 = Super_L Super_R add mod5 = Mode_switch ISO_Level3_Shift
将 Super_R 键变为 Hyper_R 键
希望在全键盘布局上拥有 Hyper
键的用户可能希望使用右侧 Super
键作为 Hyper
键。
~/.Xmodmap
remove mod4 = Super_R keycode 134 = Hyper_R add mod3 = Hyper_R
为克罗地亚语布局,交换每个数字键 N 与 Shift-N,反之亦然
应该也适用于类似于克罗地亚语的布局。
~/.Xmodmap
keycode 10 = exclam 1 1 exclam asciitilde dead_tilde asciitilde keycode 11 = quotedbl 2 2 quotedbl dead_caron caron dead_caron keycode 12 = numbersign 3 3 numbersign asciicircum dead_circumflex asciicircum keycode 13 = dollar 4 4 dollar dead_breve breve dead_breve keycode 14 = percent 5 5 percent degree dead_abovering degree keycode 15 = ampersand 6 6 ampersand dead_ogonek ogonek dead_ogonek keycode 16 = slash 7 7 slash grave dead_grave grave keycode 17 = parenleft 8 8 parenleft dead_abovedot abovedot dead_abovedot keycode 18 = parenright 9 9 parenright dead_acute apostrophe dead_acute keycode 19 = equal 0 0 equal dead_doubleacute doubleacute dead_doubleacute
参见
- xmodmap(1)
- 使用 .Xmodmap 实现多媒体键 HOWTO,作者 Christian Weiske
- 使用 xmodmap 映射不支持的按键,作者 Pascal Bleser
- LQWiki: Xmodmap 识别的 Keysyms 列表