如何防止大写锁定切换效果,而不重新映射或禁用它?

如何防止大写锁定切换效果,而不重新映射或禁用它?

我有一个 X11 程序,可以获取大写锁定并使用它。问题是,我想禁用常规大写锁定切换,但这样做似乎会禁用该键。

因此,无论 X11 获得大写锁定按键,它仍然必须获得(不禁用该键,或将其重新映射到其他按键),但没有任何将按键转换为大写切换的功能(这可能是在内核级别? )。

我尝试更改扫描码,但这只是重新映射了密钥。我也删除了大写锁定条目xmodmap,但这也禁用了大写。

我怎样才能告诉内核忽略大写键(wrt其常规功能),但仍然将消息传递给X?

只是添加更多细节:

我试图运行的“程序”是人性化的“enso”。当没有密钥时,我收到错误“CRITICAL:root:找不到准模式密钥”。当没有错误时,我可以将 enso 与 caps 一起使用,但到目前为止还没有弄清楚如何禁用 caps 功能,同时 enso 仍然能够使用它。

答案1

我认为我有一种技术可以禁用按键的切换Capslock,但不能完全禁用该按键,或者将其重新映射到键盘上的另一个按键。

如果您使用命令:

setxkbmap -option caps:none

键盘将不再切换。我在运行 Fedora 14 的笔记本电脑上确认了这一点,LED 不再亮起,正常Capslock功能也消失了。

然而使用 xev 仍然显示该键被按下:

$ xev
...
...
KeyPress event, serial 35, synthetic NO, window 0x6800001,
    root 0xb1, subw 0x0, time 261504852, (167,-15), root:(353,268),
    state 0x10, keycode 66 (keysym 0xffffff, VoidSymbol), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 35, synthetic NO, window 0x6800001,
    root 0xb1, subw 0x0, time 261504971, (167,-15), root:(353,268),
    state 0x10, keycode 66 (keysym 0xffffff, VoidSymbol), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False
    ...

因此,被按下的按键事件仍然完好无损,供其他应用程序拾取它们。

设置xkbmap

该文件/usr/share/X11/xkb/rules/xorg.lst包含您可以提供的选项的完整列表setxkbmap

在这个文件中查找“cap”,我注意到这一行:

caps:none            CapsLock is disabled

该文件中还有其他值,因此如果这不是您想要的值,那么这些替代值之一可能会更适合。

$ grep cap /usr/share/X11/xkb/rules/xorg.lst
  grp:caps_switch      CapsLock (while pressed), Alt+CapsLock does the original capslock action
  grp:caps_toggle      CapsLock
  grp:shift_caps_toggle Shift+CapsLock
  grp:shift_caps_switch CapsLock (to first layout), Shift+CapsLock (to last layout)
  grp:alt_caps_toggle  Alt+CapsLock
  lv3:caps_switch      CapsLock
  lv3:caps_switch_latch CapsLock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)
  ctrl:nocaps          Make CapsLock an additional Ctrl
  ctrl:swapcaps        Swap Ctrl and CapsLock
  grp_led:caps         CapsLock
  caps                 CapsLock key behavior
  caps:internal        CapsLock uses internal capitalization. Shift "pauses" CapsLock
  caps:internal_nocancel CapsLock uses internal capitalization. Shift doesn't affect CapsLock
  caps:shift           CapsLock acts as Shift with locking. Shift "pauses" CapsLock
  caps:shift_nocancel  CapsLock acts as Shift with locking. Shift doesn't affect CapsLock
  caps:capslock        CapsLock toggles normal capitalization of alphabetic characters
  caps:numlock         Make CapsLock an additional NumLock
  caps:swapescape      Swap ESC and CapsLock
  caps:escape          Make CapsLock an additional ESC
  caps:backspace       Make CapsLock an additional Backspace
  caps:super           Make CapsLock an additional Super
  caps:hyper           Make CapsLock an additional Hyper
  caps:shiftlock       CapsLock toggles Shift so all keys are affected
  caps:none            CapsLock is disabled
  compose:caps         CapsLock
  shift:breaks_caps    Shift cancels CapsLock
  shift:both_capslock  Both Shift-Keys together toggle CapsLock
  shift:both_capslock_cancel Both Shift-Keys together activate CapsLock, one Shift-Key deactivates

参考

答案2

如果您不希望Caps Lock按键具有其通常的效果,您可以关闭Lock修饰符,同时保留Caps_Lock按键符号。

xmodmap -e 'clear Lock'

答案3

这与我给出的答案非常相似另一个问题。这段 xkb 代码应该可以解决问题。

partial modifier_keys
xkb_symbols "capsoff" {
    key <CAPS> {
        type[Group1] = "ONE_LEVEL",
        symbols[Group1] = [ Caps_Lock ],
        actions[Group1] = [ NoAction() ]
    };
};

答案4

我以前用过@slm描述的方法但是(至少在使用 KDE Neon 的 KDE Plasma 上)这在某个时候停止工作。

不过,诀窍是 KDE 内部的设置,如下所述:https://askubuntu.com/a/439230/626920

相关内容