如何使用 xmodmap 交换 ctrl 和 capslock?

Spa*_*sle 7 x11 xmodmap keyboard-layout

我知道这个 xmodmap 脚本可以交换 ctrl 和 capslock:

remove Lock = Caps_Lock
remove Control = Control_L
keysym Caps_Lock = Control_L
keysym Control_L = Caps_Lock
add Lock = Caps_Lock
add Control = Control_L
Run Code Online (Sandbox Code Playgroud)

我不太明白。所以我试过这个:

remove Lock = Caps_Lock
remove Control = Control_L
add Lock = Control_L
add Control = Caps_Lock
Run Code Online (Sandbox Code Playgroud)

而这个脚本不起作用。
有人可以用简单的语言解释这一点(为什么第一个脚本有效而另一个无效)?

slm*_*slm 7

从重新映射大写锁定:

man xmodmap 显示了如何交换左控制键和 CapsLock 键:

!
! Swap Caps_Lock and Control_L
!
remove Lock = Caps_Lock
remove Control = Control_L
remove Lock = Control_L
remove Control = Caps_Lock
keysym Control_L = Caps_Lock
keysym Caps_Lock = Control_L
add Lock = Caps_Lock
add Control = Control_L
Run Code Online (Sandbox Code Playgroud)

这些keysym行很重要,因为它们是将键码映射到相反键的那些行,即Capslockgo to 的键码,Control L反之亦然。

摘自xmodmap 手册页*

   keysym KEYSYMNAME = KEYSYMNAME ...
           The KEYSYMNAME on the left hand side is translated into matching 
           keycodes used to perform the corresponding set of keycode 
           expressions.  Note that if the same keysym is bound to multiple 
           keys, the expression is executed for each matching keycode.
Run Code Online (Sandbox Code Playgroud)

看效果

您可以使用该工具xev查看键是否已按字面重新映射。所以Capslock现在发送扫描码Control L

例子

Capslock发送Control L

$ xev
KeyPress event, serial 36, synthetic NO, window 0x3e00001,
    root 0x86, subw 0x0, time 890946390, (803,237), root:(804,294),
    state 0x2, keycode 66 (keysym 0xffe3, Control_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 36, synthetic NO, window 0x3e00001,
    root 0x86, subw 0x0, time 890946462, (803,237), root:(804,294),
    state 0x6, keycode 66 (keysym 0xffe3, Control_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False
Run Code Online (Sandbox Code Playgroud)

Control L发送Capslock

$ xev
KeyPress event, serial 36, synthetic NO, window 0x3e00001,
    root 0x86, subw 0x0, time 891083183, (793,9), root:(794,66),
    state 0x0, keycode 37 (keysym 0xffe5, Caps_Lock), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 36, synthetic NO, window 0x3e00001,
    root 0x86, subw 0x0, time 891083302, (793,9), root:(794,66),
    state 0x2, keycode 37 (keysym 0xffe5, Caps_Lock), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False
Run Code Online (Sandbox Code Playgroud)

参考