Xmodmap (简体中文)

From ArchWiki
翻译状态:本文是 Xmodmap翻译。上次翻译日期:2021-4-15。如果英文版本有所更改,则您可以帮助同步翻译。

xmodmap是一个用于修改 Xorg 中键位图和指针按钮映射的工具。

xmodmapX keyboard extension (XKB)没有直接关系。这两个程序对于X中的如何处理"键码"的理解是不一样的(xmodmap 更早)。一般来说,它只被推荐用于最简单的任务。请参阅 X keyboard extension 了解高级布局配置。

注意:
  • xmodmap设置会被setxkbmap重置,它不仅将字母数字键改变为映射表中的值,还将所有其他键重置为启动时的默认值。[1]
  • 由于Xorg的限制,xmodmap设置不会自动应用到热插拔设备上。如果在应用了自定义映射表后,系统中添加了一个新的键盘,则必须重新应用自定义映射表。[2]

简介

Xorg 中有两种类型的键盘值:键码和键符。

键码 keycode
键码是当按键或鼠标按钮被按下时,内核收到的表示数字。
键符 keysym
键符是键码所对应的符号表达值。例如,按a产生38号键码,它被映射到0×61号键符,对应 ASCII表中的 a
Xorg中,键符通过一个定义键码-键符对应关系的表管理。这个表叫做键映射表。可以通过运行xmodmap来显示。

安装

xmodmapxorg-xmodmap 包提供。

也可以安装 xkeycaps,这是一个xmodmap的图形前端。

键映射表

打印以表达式格式呈现的键映射表:

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

每个键码后面都跟着映射到的键符。上面的例子意思是:键码57被映射到小写n键符,而大写N键符则对应按下Shift输入的57号键码。

表中的每一列键符都对应着一个特定的修饰键组合,Key为键码所对应的按键:

  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

并非所有的键符都必须设置,但如果要跳过一个键符,请将其值设为NoSymbol

要查看一个键对应的键码,请参见Keyboard input#Identifying keycodes in Xorg以了解xev实用程序的细节,它将在你按下一个键时输出相关的键码与键符信息。

提示: 多媒体键有预定义的描述性键符,例如 XF86AudioMuteXF86Mail 。这些键符可以在/usr/include/X11/XF86keysym.h 中找到。许多多媒体程序都被设计成可以直接通过这些键符控制,而不需要配置任何第三方应用程序。

请注意,xmodmap会受到 xkbd 设置的影响,所以所有8个键符都可以用于美式键盘(国际)的 xkbd 布局,但不能用于默认的美式键盘(它缺少ISO Level3中定义的ralt_switch符号)。为了让所有8个键位都可用,你应该配置把键盘设置为美式键盘(国际)。 以美式键盘布局为例,在调用 xmodmap 之前调用 $ setxkbmap -layout 'us(intl)' 以在当前X会话中测试您的更改。要永久地做这个改变,请编辑 xorg 配置或您的 .xprofile 或 .xinitrc 文件。完整解释参见Xorg/Keyboard configuration#Setting keyboard layout

自定义映射表

创建一个键映射表(即文件 ~/.Xmodmap):

$ xmodmap -pke > ~/.Xmodmap

测试您的更改:

$ xmodmap ~/.Xmodmap

激活自定义映射表

对于GDMXDMLightDM,不需要特别激活~/.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也可以用来覆盖修饰键,例如交换ControlSuper(即 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)

找到键符的修饰键

ISO_Level3_Shift
非美式键盘上的AltGr键调用修饰键ISO_Level3_Shift。(在美式键盘上,右alt Alt_R与左alt Alt_L具有相同的功能,因此将布局设置为美式键盘(国际)会更灵活。参见#键映射表
Mode_switch
默认情况下,Mode_switch修饰键可能会被映射到一个虚拟的键。
注意: 修饰键ISO_Level3_ShiftMode_switch的名称对于xmodmap和X键盘扩展是不同的。参见[3]

重新安排修饰键位

注意: xmodmap是区分大小写的。使用不正确的大小写,如Mode_Switch,(正确的是 Mode_switch)会导致错误。

在重排之前,需要清除修饰键。原来的键和新的键都得清除。例如,如果您打算将Caps_Lock换到A键,将B换成NumLock键,那么Caps_Lock,Num_Lock,A,B四个键都得清除,然后分配键位,最后再把他们加回来。

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

!用于注释一行,所以在下面的例子中,只有 ControlMod4 这两个修饰符被清除。然后,键符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键符分配给了Control修饰键,Super_LSuper_R键符分配给了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

反向滚动

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

将 CapsLock 换成 Control

CapsLock 改为 Control 的最简单的例子。

~/.Xmodmap
clear lock
clear control
keycode 66 = Control_L
add control = Control_L Control_R

将CapsLock转为Control,将左Control转为Hyper

笔记本用户可能更喜欢将CapsLock作为ControlLeft 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 变成右 Hyper

如果用户希望在全键盘布局中使用 Hyper 键,不妨将右 Super 键作为 Hyper 键。

~/.Xmodmap
remove  mod4 = Super_R
keycode  134 = Hyper_R
add     mod3 = Hyper_R

将Shift-数字键与数字键对换(克罗地亚语布局)

对于类似克罗地亚语的布局应该也能正常工作。

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

另见