xmodmap
xmodmap 是一个用于在 Xorg 中修改键映射和指针按钮映射的实用程序。
xmodmap 与 X 键盘扩展 (XKB) 没有直接关系,因为它在 X 内部处理键码 (keycodes) 的方式采用了不同的(pre-XKB)理念。通常,它仅被推荐用于最简单的任务。关于高级布局配置,请参阅 X 键盘扩展。
- xmodmap 的设置会被 setxkbmap 重置,后者不仅会将字母数字键更改为映射中给出的值,还会将所有其他键重置为启动默认值(参见 LQWiki:Configuring keyboards)。
- 由于 Xorg 的一个限制,xmodmap 的设置不会自动应用于热插拔设备。如果在应用自定义表后向系统添加键盘,则必须再次应用该自定义表。[1]
简介
在 Xorg 中有两种类型的键盘值:键码 (keycodes) 和 键符号 (keysyms)。
- keycode (键码)
- keycode 是当按键或鼠标按钮被按下时,内核接收到的数字表示。
- keysym (键符号)
- keysym 是分配给 keycode 的值。例如,按下
a会生成keycode 38,它被映射到keysym 0×61,这与 ASCII 表中的a相匹配。 - keysyms 由 Xorg 在一个定义 keycode 与 keysym 关系的键码表中管理,该表被称为 键映射表 (keymap table)。运行
xmodmap即可显示此表。
安装
xmodmap 可以通过 xorg-xmodmap 软件包 安装。
可选安装 xkeycaps,它是 xmodmap 的图形化前端。
键映射表
打印当前格式化为表达式的键映射表
$ xmodmap -pke
[...] keycode 57 = n N [...]
每个 keycode 后面跟着它所映射的 keysym。上述示例表明 keycode 57 被映射为小写 n,而大写 N 被映射为 keycode 57 加上 Shift。
表中的每一列 keysym 对应于特定的修饰键组合
按键Shift+KeyMode_switch+KeyMode_switch+Shift+KeyISO_Level3_Shift+KeyISO_Level3_Shift+Shift+Key
并非所有的 keysyms 都必须设置,但如果只想分配后面的 keysym,请使用 NoSymbol 值。
要查看哪个 keycode 对应于哪个按键,请参阅 Keyboard input#Identifying keycodes in Xorg 中关于 xev 实用程序的详细信息,该程序在你按下按键时会输出相关的键码/键符号信息。
XF86AudioMute 或 XF86Mail。这些 keysyms 可以在 /usr/include/X11/XF86keysym.h 中找到。许多多媒体程序设计为开箱即用地与这些 keysyms 配合工作,无需配置任何第三方应用程序。请注意,xmodmap 受 xkbd 设置的影响,因此所有 8 个 keysym 在 US(intl) xkbd 布局中可用,但在默认的 US 布局中不可用(缺失在 level3 中定义的 ralt_switch 符号)。为了使所有 8 个 keysym 可用,你应该配置键盘的 (intl) 变体。以 US 布局为例,在调用 xmodmap 测试当前 X 会话的更改之前,运行 $ setxkbmap -layout 'us(intl)'。要永久更改,请编辑 xorg 配置或你的 .xprofile 或 .xinitrc 文件。详见 Xorg/Keyboard configuration#Setting keyboard layout 的完整解释。
自定义表
创建键映射文件 (例如 ~/.Xmodmap)
$ xmodmap -pke > ~/.Xmodmap
测试更改
$ xmodmap ~/.Xmodmap
激活自定义表
在使用 GDM, XDM 或 LightDM 时,无需手动加载 ~/.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的功能与左 altAlt_L相同,因此建议将布局设置为 US international。见 #键映射表。) - 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 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 中提供的 自然滚动 (natural scrolling) 功能(模拟智能手机或平板电脑的滚动)可以使用 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
世界语 (Esperanto)
接下来是一个示例,通过按下 AltGr 和相关字母来输入世界语字母。例如,如果你输入 AltGr+C,你将得到字母 “Ĉ”。
~/.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)
- Christian Weiske 编写的 .Xmodmap 多媒体键 HOWTO
- Pascal Bleser 编写的 使用 xmodmap 映射不支持的按键
- LQWiki: xmodmap 识别的 Keysyms 列表