将 Escape 键转变为修改键,点击时仍可充当 Escape 键

将 Escape 键转变为修改键,点击时仍可充当 Escape 键

我使用平铺窗口管理器(目前是 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
  • 我愿意接受使用其他软件的解决方案,例如xkbxdotool等。
  • 我目前使用德国 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_LXmodmap 中,并xcape -e 'Super_L=Escape'在 XMonad 启动时运行。

相关内容