将 CAPS_LOCK + 箭头设置为 xkb 中的 Home、PgUp、PgDown、End

将 CAPS_LOCK + 箭头设置为 xkb 中的 Home、PgUp、PgDown、End

我正在尝试设置一些CapsLock+ 箭头键绑定xkb

使用 ArchLinux、KDE、Xorg

我想要实现的目标(一厢情愿的想法)

最终,完美的解决方案是

无修饰符 CapsLock作为修饰语
Left Home
Up PageUp
Right End
Down PageDown

按下时CapsLock只会在按键释放时起作用,就像正常的锁定一样CapsLock

添加Shift到混合中,或任何使用映射键的键绑定应该仍然有效。

此外,为了更好的兼容性,这些绑定应该在 keysym 级别上工作,而不是使用 (state, key)。

问题

我不相信这能达到我想要的效果,甚至可能无法解析

capslock_nav(添加到/usr/share/X11/xkb/symbols

xkb_symbols "lv3-arrow-nav" {
    include "level3(caps_switch)"
    key.type = "THREE_LEVEL";
    key   <UP> {         [              Up, Up, Prior, NoSymbol] };
    key <LEFT> {         [            Left, Left, Home, NoSymbol ] };
    key <RGHT> {         [           Right, Right, End, NoSymbol ] };
    key <DOWN> {         [            Down, Down, Next, NoSymbol ] };
}

我一直试图通过在声明中设置并使用它来实现这一点CapsLockISO_Level3_Shiftsymbols没有成功。

迄今为止的进展

我的更改在 KDE 的列表中可见Settings > Keyboard > Advanced,这是通过添加条目来完成的 evdev.xml,如下所示

<!-- ... under <optionList> ... -->
<group allowMultipleSelection="true">
      <configItem>
        <name>capslock_nav</name>
        <description>Navigation using CapsLock</description>
      </configItem>
      <option>
        <configItem>
          <name>capslock_nav:lv3-arrow-nav</name>
          <description>Caps Lock Arrow Navigation</description>
        </configItem>
      </option>
    </group>

和这个evdev.lst,只是为了确定

...
  capslock_nav         Navigation using CapsLock
  capslock_nav:lv3-arrow-nav Caps Lock Arrow Navigation
...

这也反映在setxkbmap

setxkbmap -print -query
xkb_keymap {
        xkb_keycodes  { include "evdev+aliases(qwerty)" };
        xkb_types     { include "complete"      };
        xkb_compat    { include "complete"      };
        xkb_symbols   { include "pc+pl+inet(evdev)"     };
        xkb_geometry  { include "pc(pc86)"      };
};
rules:      evdev
model:      pc86
layout:     pl
options:    capslock_nav:lv3-arrow-nav


options包含我的更改,但它不包含在xkb_symbols. xkbcomp $DISPLAY -也没有提及我的改变。

我已经浏览了 ArchWiki 和有关该主题的各种在线文章,但它有点复杂。我感觉自己在进步,只是进步很慢。

编辑:到目前为止的进展

我已经放弃了我的配置并开始工作 archwiki 上的 xkb#caps hjkl

并准备好这个配置,我已将其拆分为相应的文件(compatsymbols types

partial xkb_types "lv3-arrow-nav" {
    include "complete";
    type "CUST_CAPSLOCK" {
       modifiers= Shift+Lock; 
       map[Shift] = Level2;            //maps shift and no Lock. Shift+Alt goes here, too, because Alt isn't in modifiers.
       map[Lock] = Level3;
       map[Shift+Lock] = Level3;       //maps shift and Lock. Shift+Lock+Alt goes here, too.
       level_name[Level1]= "Base";
       level_name[Level2]= "Shift";
       level_name[Level3]= "Lock";
   };
}

partial xkb_compatibility "lv3-arrow-nav" {
    interpret Caps_Lock {
        action= SetMods(modifiers=Lock);
    };
    augment "complete";
    augment "caps(caps_lock)";
}

partial xkb_symbols "lv3-arrow-nav" {
    include "pc";
    key <LEFT> {
       type= "CUST_CAPSLOCK",
       symbols[Group1]= [               Left,               Left,               Home],
       actions[Group1]= [      NoAction(),      NoAction(),   RedirectKey(keycode=<LEFT>, clearmods=Lock) ]
    };
    key <UP> {
        type= "CUST_CAPSLOCK",
        symbols[Group1]= [               Up,               Up,               Prior],
        actions[Group1]= [      NoAction(),      NoAction(),   RedirectKey(keycode=<UP>, clearmods=Lock) ]
    };
    key <RGHT> {
        type= "CUST_CAPSLOCK",
        symbols[Group1]= [               Right,               Right,               End],
        actions[Group1]= [      NoAction(),      NoAction(),   RedirectKey(keycode=<RGHT>, clearmods=Lock) ]
    };
    key <DOWN> {
        type= "CUST_CAPSLOCK",
        symbols[Group1]= [               Down,               Down,               Next],
        actions[Group1]= [      NoAction(),      NoAction(),   RedirectKey(keycode=<DOWN>, clearmods=Lock) ]
    };
}

我已经使用 进行了验证xkbcomp,但它仍然没有按预期方式运行。

编辑2

嗯,至少是这样某物,因为这个配置,

xkb
├── compat
│  └── capslock_nav
├── rules
│  └── evdev
├── symbols
│  └── capslock_nav
├── types
│  └── capslock_nav
└── xkb_keymap.xkb

应用使用

xkbcomp -I$HOME/xkb/ $HOME/xkb/xkb_keymap.xkb $DISPLAY

至少禁用大写锁定...

编辑3

看起来我已经取得了一些进展,通过NoAction()symbols定义中定义所有操作 =

答案1

据我所知,这似乎是:

在职的

  • CapsLock+ Left, Up, Right,Down作为Home, PageUp, End,PageDown
  • 保留现有的布局设置(我仍然可以使用pl布局,在 KDE 的键盘设置中设置)

不工作

  • 与 KDE 的keyboard > advanced切换集成 - 切换是存在的,但只有symbols在通过以下方式查询时才会发生变化:setxkbmap -query
  • CapsLock像往常一样独立的CapsLock闩锁

解决方案

我创建了一个符合 xkeyboard-config 的文件夹结构,如下所示( xkb/**/* 部分)

$HOME/xkb_mod
├── xkb
│  ├── compat
│  │  └── capslock_nav
│  ├── symbols
│  │  └── capslock_nav
│  └── types
│     └── capslock_nav
└── xkb_keymap.xkb

xkb/-I将成为包含的一部分

文件内容

(灵感来自https://wiki.archlinux.org/title/X_keyboard_extension#Caps_hjkl_as_vimlike_arrow_keys

compat/capslock_nav

partial xkb_compatibility "caps-arrow-nav" {
    interpret Caps_Lock {
        action= SetMods(modifiers=Lock);
    };
};

symbols/capslock_nav

partial xkb_symbols "caps-arrow-nav" {
    key <LEFT> {
       type= "CUST_CAPSLOCK",
       symbols[Group1]= [               Left,               Left,               Home]
    };
    key <UP> {
        type= "CUST_CAPSLOCK",
        symbols[Group1]= [               Up,               Up,               Prior]
    };
    key <RGHT> {
        type= "CUST_CAPSLOCK",
        symbols[Group1]= [               Right,               Right,               End]
    };
    key <DOWN> {
        type= "CUST_CAPSLOCK",
        symbols[Group1]= [               Down,               Down,               Next]
    };
};

types/capslock_nav

partial xkb_types "caps-arrow-nav" {
    type "CUST_CAPSLOCK" {
       modifiers= Shift+Lock; 
       map[Shift] = Level2;            //maps shift and no Lock. Shift+Alt goes here, too, because Alt isn't in modifiers.
       map[Lock] = Level3;
       map[Shift+Lock] = Level3;       //maps shift and Lock. Shift+Lock+Alt goes here, too.
       level_name[Level1]= "Base";
       level_name[Level2]= "Shift";
       level_name[Level3]= "Lock";
   };
};

之后我查询了现有设置并将它们放入xkb_keymap.xkb

setxkbmap -query > ~/xkb_mod/xkb_keymap.xkb

并手动包含+capslock_nav(caps-arrow-nav)在 every 中include,如下所示:

xkb_keymap.xkb

xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete+capslock_nav(caps-arrow-nav)" };
    xkb_compat    { include "complete+capslock_nav(caps-arrow-nav)" };
    xkb_symbols   { include "pc+pl+inet(evdev)+capslock_nav(caps-arrow-nav)"    };
    xkb_geometry  { include "pc(pc86)"  };
};

最后,我通过运行应用了配置

xkbcomp -I$HOME/xkb_mod/xkb xkb_mod/xkb_keymap.xkb $DISPLAY

相关内容