Keyboard

將 Escape 鍵變成一個修飾符,在點擊時仍充當 Escape

  • June 4, 2020

我使用平鋪視窗管理器(目前是 xMonad),因此我需要一個充當視窗管理“控制鍵”的鍵。每當我使用帶有 Windows/Super/Mod4 鍵的鍵盤時,我將左 Windows 鍵用作該鍵,而我的右 Windows 鍵用作 Compose/Multi_key。

但是,我也有幾個(

$$ very $$舊的)沒有任何 Windows 鍵的鍵盤(即它們是無鍵的),並且我沒有任何可以(舒適地)用作我的“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_LXmodmap 中,並xcape -e 'Super_L=Escape'在 XMonad 啟動時執行。

引用自:https://unix.stackexchange.com/questions/435142