xmodmap

来自 ArchWiki

此文章或章节需要扩充。

原因: 为什么 xmodmap 仅推荐用于最简单的任务? (在 Talk:Xmodmap 中讨论)

xmodmap 是一个用于修改 Xorg 中的键盘映射和指针按钮映射的实用程序。

xmodmapX 键盘扩展 (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 匹配。
keysymsXorg 在定义键码-keysym 关系的键码表中管理,这被称为键盘映射表。这可以通过运行 xmodmap 来显示。

安装

xmodmap 可以通过 xorg-xmodmap 软件包安装

可选地,安装 xkeycaps,它是 xmodmap 的图形前端。

键盘映射表

打印当前键盘映射表,格式化为表达式

$ xmodmap -pke
[...]
keycode  57 = n N
[...]

每个键码后面都跟着它映射到的 keysym。上面的例子表明键码 57 映射到小写字母 n,而大写字母 N 映射到键码 57 加上 Shift 键。

表中的每个 keysym 列对应于修饰键的特定组合

  1. Key
  2. Shift+Key
  3. Mode_switch+Key
  4. Mode_switch+Shift+Key
  5. ISO_Level3_Shift+Key
  6. ISO_Level3_Shift+Shift+Key

并非所有 keysyms 都必须设置,但要仅分配后面的 keysym,请使用 NoSymbol 值。

要查看哪个键码对应于某个按键,请参阅 键盘输入#在 Xorg 中识别键码,了解关于 xev 实用程序的详细信息,当您按下按键时,它将输出关于按键的相关键码/keysym 信息。

提示: 有针对多媒体键的预定义描述性 keysyms,例如 XF86AudioMuteXF86Mail。这些 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

激活自定义表

使用 GDMXDMLightDM,无需 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 也可以用于覆盖修饰键,例如交换 ControlSuperWindows 键)。

详细打印当前修饰符表(完整示例)

$ 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 列修饰键

此文章或章节是与 #键盘映射表 合并的候选对象。

注释: 本节的重点似乎不是查找任何内容。修饰键的含义应在 #键盘映射表 中首次提及的地方进行解释。 (在 Talk:Xmodmap 中讨论)
ISO_Level3_Shift
非美国键盘上的 AltGr 键调用修饰键 ISO_Level3_Shift。(在美国键盘上,右 alt 键 Alt_R 与左 alt 键 Alt_L 具有相同的功能,这使得将布局设置为美国国际键盘是更可取的。请参阅 #键盘映射表。)
Mode_switch
Mode_switch 修饰符默认可能映射到您的键盘上没有的按键。
注意: ISO_Level3_ShiftMode_switch 修饰符名称的用法在 xmodmap 和 X 键盘扩展 之间有所不同。另请参阅 [2]

重新分配修饰键到键盘上的按键

注意: xmodmap 是大小写敏感的。使用不正确的大小写,例如 Mode_Switch 而不是正确的 Mode_switch 将会导致错误。

在分配之前,需要清除修饰键。这适用于您打算分配的修饰键和您打算使用的按键上的修饰键。例如,如果您打算将 Caps_Lock 分配给您的 A 键,并将 B 分配给您的 NumLock 键,您需要首先清除 Caps_LockNum_Lock 的修饰符,然后分配 keysyms,最后添加回修饰符。

~/.Xmodmap
[...]
clear lock
clear mod2
keycode  38 = Caps_Lock
keycode  77 = Num_Lock
add lock = Caps_Lock
add mod2 = Num_Lock

! 是注释,因此在以下示例中仅清除修饰符 ControlMod4。然后将 keysyms Control_LControl_RSuper_LSuper_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_LControl_R keysyms 已分配给 Control 修饰符,而 Super_LSuper_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 键

此文章或章节是与 Xorg/键盘配置#配置 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

键码编号可能因键盘型号而异。

反向滚动

此文章或章节是与 鼠标按键 合并的候选对象。

注释: xmodmap 不是执行此操作的唯一方法。 (在 Talk:Xmodmap 中讨论)

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

交换鼠标按键

此文章或章节是与 鼠标按键 合并的候选对象。

注释: xmodmap 不是执行此操作的唯一方法。 (在 Talk: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 修饰符(emacsopenboxi3 的附加修饰符)。

~/.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

参见