我正在尝试设置一些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 ] };
}
我一直试图通过在声明中设置并使用它来实现这一点CapsLock,ISO_Level3_Shift
但symbols
没有成功。
迄今为止的进展
我的更改在 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
并准备好这个配置,我已将其拆分为相应的文件(compat
,symbols
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