我使用平铺窗口管理器(目前是 xMonad),因此我需要一个充当窗口管理“控制键”的键。每当我使用带有 Windows/Super/Mod4 键的键盘时,我将左 Windows 键用作该键,而我的右 Windows 键用作 Compose/Multi_key。
但是,我也有几个([非常]旧的)键盘没有任何 Windows 键(即它们没有 winkeyless),而且我没有任何可以(舒适地)用作我的键'WM 控制键'。过去,因为 xMonad 允许这样做,所以我使用 Control+Alt 作为我的“WM 控制键(组合)”,但一段时间后我注意到,这会干扰(一些)Emacs(移动命令),所以这不是一个选项了。因此,我认为我可以通过以下方式使用我的 Escape 键:
- 如果我按住 Ecs,它的作用就像 Mod4
- 如果我点击 Esc,它将充当 Escape
AFAIK,按住 Escape 并不会正常执行任何操作,所以我认为这样做可能是个好主意。然后我尝试通过使用来实现这一点xmodmap
:
clear Mod4
add Mod4 = Super_L Escape
我所期望的:Super_L 仍然充当 Super,而 Escape 现在是一个额外的 Super。下一步将是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(按下一次)和Super(按下时;我在尝试测试更改时注意到了这一点),尽管此时我还没有使用过
xcape
。
这是一个错误xmodmap
,还是我使用xmodmap
不正确?我怀疑是后者,但是有人可以帮助我实现我想要做的事情吗?
更多信息(希望不是无关紧要的):
- 我目前的操作系统是 Arch Linux
- 我对使用其他软件的解决方案持开放态度,例如
xkb
,xdotool
等。 - 我目前正在使用德国 QWERTZ 布局(即 ISO,而不是 ANSI),有时使用Neo(其中,AFAIK 被实现为
de
键映射/布局的另一种变体;请参见localectl
下面的输出) - 我希望我的解决方案能够独立于键盘/硬件工作:如果我更换键盘,我不想更改任何配置文件。
- 在任何人建议之前:将 Super 映射到 Capslock 不是一个选项,因为我有时使用 Neo 布局,它使用 Capslock 作为其第 3 层修改器之一,它也用于第 5 层和第 6 层。这也意味着我希望这个解决方案也独立于键盘布局,因此我可以轻松地在 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
我为此使用xcape。将密钥映射到
Super_L
Xmodmap 中,并xcape -e 'Super_L=Escape'
在 XMonad 启动时运行。