如何将大写锁定映射到箭头键?

如何将大写锁定映射到箭头键?

我正在尝试将 Caps Lock 映射到向下箭头键,并将带有 shift 修饰键的 Caps Lock 映射到向上箭头键。

我尝试使用 xmodmap 和以下输入文件:

remove Lock = Caps_Lock
keycode 66 = Down Up

按下 Caps Lock 可以发送向下箭头键,但按下 Caps Lock + shift 不会发送向上箭头键。

我究竟做错了什么?

答案1

此解决方案将包含大量技术细节。请随意跳至布局文件如果您不关心问题而只关心解决方案,则请参阅该部分。

修改映射

在我的系统上,通过CAPSShift+上下移动可以按照预期运行。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文件中的相应定义。

  • 您不再需要大写键修饰符。因此,我添加了 的一种替代Capsshift(both_capslock_cancel)通过同时按下LSHIFTRSHIFT,您可以激活锁CAPS Lock,然后按任何其他键即可再次释放锁Shift

  • 如果有人想知道为什么我没有为此使用新的类型定义:我根本无法在触发向上键的操作之前释放 Shift 修饰键。不过,通过显式调用分离的 ,应该可以释放 Shiftpreserve[Shift] = Nonexkb_types

  • 正如下面的评论所述,Wayland 也将依赖 XKB,但不允许重定向。

答案2

在 Linux 上,我强烈推荐密钥。您可以查看示例配置,它将帮助您实现目标。 克莫纳德是一种替代方案

相关内容