在 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 中创建更多自定义键映射。
使用 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(或两者)是否被按下。
虽然使用 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 中找到所有选项