让修饰键在 X 下充当切换键

让修饰键在 X 下充当切换键

有没有办法让ShiftCtrlAlt键在 X 下充当切换键?我知道如何在 CLI 下做到这一点(例如,通过执行) 但在 X 下没有找到这样做的参考。

请注意,这是不是有关粘滞键的问题,可以通过辅助功能选项启用。

答案1

据我所知,这是在 DE 级别实现的。KDE 有锁定粘滞键的选项:

启用“锁定粘滞键”后:

如果您按Shift两次该键,然后按该F键,计算机会将其解释为Shift+ F。现在,如果您输入 P,计算机会将其解释为字母 P ( Shift+ P)。要取消选择 Shift 键,请再次按下该键。

http://docs.kde.org/stable/en/kdebase-workspace/kcontrol/kcmaccess/index.html

答案2

X11 中的按键使用 xmodmap 重新映射,但 /usr/include/X11/keysymdef.h 中没有 Control_Lock

如果您有几个键,您可以将 Control 映射到 ISO_Next_Group_Lock 之类的东西,并使用Control+在此组中定义您的键Key

我在这里找到了一些信息: https://bbs.archlinux.org/viewtopic.php?id=75771

答案3

这可以使用 XKB 兼容组件来实现

  1. 检查您正在使用的兼容性变体

    $ setxkbmap -v -query
    Trying to build keymap using the following components:
    keycodes:   evdev+aliases(qwerty)
    types:      complete
    compat:     complete
    symbols:    pc+us(altgr-intl)+us:2+inet(evdev)
    geometry:   pc(pc105)
    rules:      evdev
    model:      pc105
    layout:     us,us
    variant:    altgr-intl,
    
    $ more /usr/share/X11/xkb/compat/complete 
    default xkb_compatibility "complete"  {
        include "basic"
        augment "iso9995"
        augment "mousekeys"
        augment "accessx(full)"
        augment "misc"
        augment "xfree86"
        augment "level5"
        augment "caps(caps_lock)"
    };
    
  2. 修改misc文件,其中包含所需的修饰符解释

    sudo nano /usr/share/X11/xkb/compat/misc
    

    我已将Shift_LAlt_L&Alt_R操作从更改SetModsLockMods,添加了新的Shift_RControl_L&Control_R解释LockMods并进行了注释//setMods.clearLocks(不确定是否有必要)。以下是完整文件:

    default partial xkb_compatibility "misc"  {
    
        virtual_modifiers   Alt,Meta,Super,Hyper,ScrollLock;
    
        // Interpretations for some other useful keys
    
        interpret Terminate_Server {
            action = Terminate();
        };
    
        //setMods.clearLocks= True;
    
        // Sets the "Alt" virtual modifier
    
        interpret Alt_L+Any     {
            //useModMapMods= level1;
        virtualModifier= Alt;
        action = LockMods(modifiers=modMapMods);
        };
    
        interpret Alt_L {
        action = LockMods(modifiers=Alt);
        };
    
        interpret Alt_R+Any     {
            //useModMapMods= level1;
        virtualModifier= Alt;
        action = LockMods(modifiers=modMapMods);
        };
    
        interpret Alt_R {
        action = LockMods(modifiers=Alt);
        };
    
        // Sets the "Meta" virtual modifier
    
        interpret Meta_L+Any     {
    //        useModMapMods= level1;
        virtualModifier= Meta;
        action = SetMods(modifiers=modMapMods);
        };
    
        interpret Meta_L    {
        action = SetMods(modifiers=Meta);
        };
    
        interpret Meta_R+Any     {
            //useModMapMods= level1;
        virtualModifier= Meta;
        action = SetMods(modifiers=modMapMods);
        };
    
        interpret Meta_R    {
        action = SetMods(modifiers=Meta);
        };
    
        // Sets the "Super" virtual modifier
    
        interpret Super_L+Any     {
    //        useModMapMods= level1;
        virtualModifier= Super;
        action = SetMods(modifiers=modMapMods);
        };
    
        interpret Super_L   {
        action = SetMods(modifiers=Super);
        };
    
        interpret Super_R+Any     {
            //useModMapMods= level1;
        virtualModifier= Super;
        action = SetMods(modifiers=modMapMods);
        };
    
        interpret Super_R   {
        action = SetMods(modifiers=Super);
        };
    
        // Sets the "Hyper" virtual modifier
    
        interpret Hyper_L+Any     {
    //        useModMapMods= level1;
        virtualModifier= Hyper;
        action = SetMods(modifiers=modMapMods);
        };
    
        interpret Hyper_L   {
        action = SetMods(modifiers=Hyper);
        };
    
        interpret Hyper_R+Any     {
            //useModMapMods= level1;
        virtualModifier= Hyper;
        action = SetMods(modifiers=modMapMods);
        };
    
        interpret Hyper_R   {
        action = SetMods(modifiers=Hyper);
        };
    
        // Sets the "ScrollLock" virtual modifier and
        // makes it actually lock when pressed.  Sets
        // up a map for the scroll lock indicator.
        interpret Scroll_Lock+Any   {
        virtualModifier= ScrollLock;
        action = LockMods(modifiers=modMapMods);
        };
    
        include "ledscroll"
    
        include "misc(assign_shift_left_action)"
    };
    
    partial xkb_compatibility "assign_shift_left_action"  {
        // Because of the irrevertable modifier mapping in symbols/pc <LFSH> is 
        // getting bound to the Lock modifier when using 
        // symbols/shift(both_capslock), creating unwanted behaviour. 
        // This is a quirk, to circumvent the problem.
        interpret Shift_L {
            action = LockMods(modifiers = Shift);
        };
    
        interpret Shift_R {
            action = LockMods(modifiers = Shift);
        };
    
        interpret Control_L {
            action = LockMods(modifiers = Control);
        };
    
        interpret Control_R {
            action = LockMods(modifiers = Control);
        };
    
    };
    
  3. 编译更改并更新 initramfs 映像

    sudo dpkg-reconfigure xkb-data
    sudo update-initramfs -u -k all
    
  4. 重启

参考:

相关内容