尝试了解 XKB 以及如何自定义键盘映射,特别是修饰符。
禁用修饰符的一个小实验会导致意想不到的结果:
(1) 之前的修饰符映射
$ 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), Alt_R (0x6c), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3
mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
(2) 清除锁定修饰符
$ xmodmap -e 'clear Lock'
(3) 清除完毕
$ xmodmap -pm
xmodmap: up to 4 keys per modifier, (keycodes in parentheses):
shift Shift_L (0x32), Shift_R (0x3e)
lock
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x40), Alt_R (0x6c), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3
mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
我原本希望禁用 CapsLock 设置锁定状态,但事实并非如此。它像往常一样工作,并且使用xev
查看按键事件,我看到锁定标志仍然发生变化(state 0x0
当 CapsLock 关闭时,state 0x2
打开时)。
该命令实际上在做什么clear
?
如何分离键(键码)以禁用其作为修饰符的功能?
答案1
实际上,CapsLock 功能与按下的按键的键符号值绑定。要查看键码到键符号的映射,请执行xmodmap -pke
。 (键码 66)的映射CapsLock应为 ( | grep 'keycode 66'
):
keycode 66 = Caps_Lock NoSymbol Caps_Lock
你可以玩一下xev
。阅读更多内容ArchWiki:Xmodmap#简介。
如何分离键(键码)以禁用其作为修饰符的功能?
您需要更改 的映射CapsLock。
要禁用CapsLock,您需要取消映射它:
xmodmap -e 'keycode 66 = NoSymbol NoSymbol NoSymbol'
要启用CapsLock,您需要将其再次映射为默认值:
xmodmap -e 'keycode 66 = Caps_Lock NoSymbol Caps_Lock'
明确的命令实际上在做什么?
它清除修饰符的映射,而不是键码的映射。更多内容请参见ArchWiki:Xmodmap#Modifier_keys