我正在尝试将 Caps Lock 映射到向下箭头键,并将带有 shift 修饰键的 Caps Lock 映射到向上箭头键。
我尝试使用 xmodmap 和以下输入文件:
remove Lock = Caps_Lock
keycode 66 = Down Up
按下 Caps Lock 可以发送向下箭头键,但按下 Caps Lock + shift 不会发送向上箭头键。
我究竟做错了什么?
答案1
此解决方案将包含大量技术细节。请随意跳至布局文件如果您不关心问题而只关心解决方案,则请参阅该部分。
修改映射
在我的系统上,通过CAPS和Shift+上下移动可以按照预期运行。CAPS.Xmodmap
您可以通过调用以下方法检查您的设置是否实际生效
$ xmodmap -pk | grep ^\\s*66
66 0xffe5 (Caps_Lock) 0x0000 (NoSymbol) 0xffe5 (Caps_Lock)
$ setxkbmap -layout us && xmodmap ~/.Xmodmap
$ xmodmap -pk | grep ^\\s*66
66 0xff54 (Down) 0xff52 (Up)
LEVEL2 修改器
您的问题接下来还有另一个(真正的)问题:
<SHIFT>
按下按钮激活的LEVEL2修饰键Shift用于在使用箭头键移动行时在文本编辑器中直观地标记字符。如果您分配<UP>
↑给第二级<CAPS>
,则您实际上正在按Shift+ ↑。您必须针对该场景停用 Shift 修饰键。据我所知,您无法使用 xmodmap 执行此操作。
重定向 LEVEL2 修改器
修改键映射的“真正方法”是陳小嶺。我找到了解决方案旧的 xorg 邮件列表。的 LEVEL2Caps必须重定向到↑( <UP>
) 键(顺便说一下,Up-Key 只有一个级别。)在 X.org 上,您可以使用Shift内置函数在重定向期间停用修饰键RedirectKey(key=<UP>, clearmods=Shift)
。clearmods 在实际“按下”键之前“释放”Shift 修饰键。
布局文件
激活行为的最简单方法是创建一个新的布局文件:
/usr/share/X11/xkb/symbols/capslockarrow
default partial xkb_symbols "basic" {
include "de(basic)"
include "shift(both_capslock_cancel)"
key <CAPS> {
type[Group1] = "TWO_LEVEL",
symbols[Group1] = [ Down, NoSymbol ],
actions[Group1] = [ NoAction(), RedirectKey(key=<UP>, clearmods=Shift) ]
};
};
使用以下方式激活新布局
setxkbmap capslockarrow
布局文件注释
新的布局文件源自
de(basic)
。这是标准德语键盘。您可以在此处添加任何其他布局,例如us(basic)
或us(euro)
。查看/usr/share/X11/xkb/symbols/
以了解可能的布局。两个字母的代码是文件名,括号中是xkb_symbols
文件中的相应定义。您不再需要大写键修饰符。因此,我添加了 的一种替代Caps:
shift(both_capslock_cancel)
通过同时按下LSHIFT和RSHIFT,您可以激活锁CAPS Lock,然后按任何其他键即可再次释放锁Shift。如果有人想知道为什么我没有为此使用新的类型定义:我根本无法在触发向上键的操作之前释放 Shift 修饰键。不过,通过显式调用分离的 ,应该可以释放 Shift
preserve[Shift] = None
键xkb_types
。正如下面的评论所述,Wayland 也将依赖 XKB,但不允许重定向。