我可以将 Caps Lock 更改为 Hyper/Additional 修饰符吗?

6 emacs keyboard-layout

在 Arch Linux 中,我有 Caps Lock 功能作为备用 Ctrl:在控制台中通过个人键盘映射,在 X 中通过xorg.conf.

我已经对将 Caps Lock 更改为 Hyper 修饰符进行了一些研究,听起来这在控制台中是不可行的,但是有什么办法可以为 X 做到这一点?

这是我目前用于 X 的内容:

Option "XkbOptions" "ctrl:nocaps"
Run Code Online (Sandbox Code Playgroud)

有没有一个XkbOptions选项或类似的东西可以让 Caps Lock 像一个额外的修饰符一样?

我的目标是能够使用 new 修饰符在 Emacs 中创建更多自定义键映射。

win*_*ner 8

使用 xmodmap 可能更容易做到这一点。将以下内容放入您的 .xsession 或 .xinitrc:

xmodmap -e "keysym Caps_Lock = Hyper_L"
Run Code Online (Sandbox Code Playgroud)

您还需要确保将 Hyper_L 分配给不与其他键共享的修饰符映射,否则它可能会为这些键生成修饰符(或者这些键可能变成 Hyper)。xmodmap不带参数运行(您的输出可能不同):

> xmodmap
xmodmap:  up to 3 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock      
control     Control_L (0x25),  Control_L (0x42),  Control_R (0x69)
mod1        Alt_L (0x40),  Alt_R (0x6c),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3        
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce), Hyper_L (0x4e)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)
Run Code Online (Sandbox Code Playgroud)

在本例中,Hyper_L 被分配给与 Super 键相同的修饰符,因此被视为 Super 键。这些命令将从 mod4 中删除它并将其放入空的 mod3 修改器映射中:

xmodmap -e "remove Mod4 = Hyper_L" -e "add Mod3 = Hyper_L"
Run Code Online (Sandbox Code Playgroud)

如果 Hyper_L 未出现在修改器贴图列表中,则可能不需要删除命令。

修改器地图的神秘性是由于 X11 如何传达修改器是否已关闭。它发送一个一字节的位域,每个位对应一个修饰符映射,而不是发送“Hyper”或“Super”。应用程序必须查看修改器映射并找出特定位的实际含义。例如,如果您将 Super 和 Hyper 键都分配给 mod4,则应用程序无法判断 Super 或 Hyper(或两者)是否被按下。

  • 它可以工作(`xev` 将 CapsLock 选择为 Hyper_L)...但它的作用更像是 Shift 而不是 Ctrl/Alt,并且 Emacs 不会将其作为修饰符选择。我还能做些什么吗? (2认同)

Pet*_*oeg 1

虽然使用 xmodmap 的其他答案是正确的,但还有一种更简单的方法。代替:

Option "XkbOptions" "ctrl:nocaps"
Run Code Online (Sandbox Code Playgroud)

只需使用:

Option "XkbOptions" "caps:hyper"
Run Code Online (Sandbox Code Playgroud)

您可以在 /usr/share/X11/xkb/rules/base.lst 中找到所有选项

  • 对我来说,这将大写分配给超级键,而不是超级键。 (5认同)