我使用平铺窗口管理器(目前是 xMonad),因此我需要一个充当窗口管理“控制键”的键。每当我使用带有 Windows/Super/Mod4 键的键盘时,我都会使用左侧 Windows 键作为该键,而右侧 Windows 键则充当 Compose/Multi_key。
然而,我也有几个([非常]旧的)键盘,它们没有任何 Windows 键(即它们没有 winkey),而且我没有任何可以(舒适地)用作我的键“WM 控制键”。过去,因为 xMonad 允许,所以我使用 Control+Alt 作为我的“WM 控制键(组合)”,但正如我在一段时间后注意到的那样,这会干扰(某些)Emacs(移动命令),所以这不是不再是一个选择了。因此,我认为我可以通过以下方式使用 Escape 键:
- 如果我按住 Ecs,它的作用就像 Mod4
- 如果我点击 Esc,它就相当于 Esc
AFAIK,按住 Escape 通常不会做任何事情,所以我认为这样做可能是个好主意。然后我尝试使用以下方法来实现这一目标xmodmap
:
clear Mod4
add Mod4 = Super_L Escape
我的预期是:Super_L 仍然充当超级,而 Escape 现在是一个额外的超级。下一步是使用xcape
来恢复(一些)旧的 Escape 键行为。
我得到了什么( 的输出xmodmap
):
xmodmap: up to 4 keys per modifier, (keycodes in parentheses):
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x42)
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x40), Meta_L (0xcd)
mod2 Num_Lock (0x4d), Hyper_L (0xcf)
mod3 Scroll_Lock (0x4e), Mode_switch (0xcb)
mod4 Escape (0x9), y (0x34), Super_L (0x85), Super_L (0xce)
mod5 ISO_Level3_Shift (0x5c)
我不明白的是:
- 为什么
y
突然也设置为Mod4? - 为什么 Escape 仍然可以用作 Escape(按一次时)和超级(按住时;当我尝试测试我的更改时我注意到了这一点),尽管此时我尚未使用
xcape
。
这是一个错误xmodmap
,还是我使用xmodmap
不正确?我怀疑是后者,但是有人可以帮助我实现我想要做的事情吗?
更多信息(希望不是无关紧要的):
- 我当前的操作系统是 Arch Linux
- 我愿意接受使用其他软件的解决方案,例如
xkb
、xdotool
等。 - 我目前使用德国 QWERTZ 布局(即 ISO,而不是 ANSI),有时尼奥(据我所知,它是作为
de
键盘映射/布局的另一种变体实现的;请参阅下面的输出localectl
) - 我希望我的解决方案能够发挥作用键盘/独立于硬件:如果我更换键盘,我不想更改任何配置文件。
- 在有人提出这一点之前:将 Super 映射到 Capslock 不是一个选项,因为我有时使用 Neo 布局,它使用 Capslock 作为其第三层修饰符之一,并且它也用于第五层和第六层。这也意味着我希望这个解决方案是键盘布局独立,这样我就可以轻松地在 Neo 和 QWERTZ 之间切换。
- 我仍然愿意接受其他建议。我唯一的要求:对任何其他程序(例如 Emacs 或 Vim)没有/最小的干扰,并且用作我的“WM 控制键”的键(组合)应该位于键盘的左侧,因为大多数其他程序我用来控制 WM 的键位于键盘的右侧(例如 h、j、k、l...)。
在进行任何更改之前,即我当前的情况,xmodmap
输出:
xmodmap: up to 2 keys per modifier, (keycodes in parentheses):
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x42)
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x40), Meta_L (0xcd)
mod2 Num_Lock (0x4d), Hyper_L (0xcf)
mod3 Scroll_Lock (0x4e), Mode_switch (0xcb)
mod4 Super_L (0x85), Super_L (0xce)
mod5 ISO_Level3_Shift (0x5c)
我的当前.Xmodmap
是:
add Mod3 = Scroll_Lock
并localectl
说:
System Locale: LANG=de_DE.UTF-8
LC_COLLATE=C
VC Keymap: de-latin1-nodeadkeys
X11 Layout: de,de
X11 Model: pc105
X11 Variant: nodeadkeys,neo
X11 Options: compose:rwin,grp:ctrls_toggle
答案1
我用X角为了这。将密钥映射到Super_L
Xmodmap 中,并xcape -e 'Super_L=Escape'
在 XMonad 启动时运行。