Zsh

理解鍵綁定的問題

  • April 26, 2016

我有一個設置和一個 zsh 會話

~ bindkey | grep help    
"^[H" run-help
"^[h" run-help

為什麼當我按“Control + [ + h”時游標下的字會被刪除並且沒有任何反應,但是如果我按“Alt + h”手冊頁正確打開?

^[實際上意味著轉義字元。在這裡查看:https ://en.wikipedia.org/wiki/ASCII

在您的情況下,您的 ALT 鍵似乎是 Escape 鍵的同義詞: https ://en.wikipedia.org/wiki/Alt_key

嘗試立即按Control+ [,然後按h

終端不會將按鍵直接發送到外殼(如Control被按下/釋放)。相反,終端根據按下的鍵發送字元序列。序列中的鍵是按順序按下的——嗯——而不是一次全部按下。最大的例外是Control-keys 和Alt-keys 與其他鍵同時按下以創建特定序列。

正如您已經知道/注意到的那樣,它^用作Control-key 的符號,但它僅與以下字元一起具有此含義。^A表示Control+aControl+ A,大寫和小寫字元組合的鍵順序相同Control(這也是終端經常使用Control+ Shift+SOMEKEY作為自己的快捷鍵的原因,而不是與 shell 相關的快捷鍵)。

^[字面意思是Control+ [。它也是由Escape. 所以^[a意味著Control+[後跟a(小寫!)。此外,Alt-key 還發送^[序列,然後是按下它的鍵。所以Alt+a也發送^[a. Alt++發送. Shift_a``^[A


因此,對於您的範例,您可以按以下任一鍵(“+”表示“同時”,“,”表示“按順序”):

  • 為了^[h
    • Alt+h
    • Escape,h
    • Control+ [,h
  • 為了^[H
    • Control+ [, Shift+h
    • Alt+ Shift+h
    • Escape, Shift+h

特殊鍵,如,PgUp或也發送鍵序列。這些通常取決於終端仿真器。您可以使用或小元件來顯示鍵序列。預設情況下,它們綁定到各自的模式。因此,按+後跟有問題的組合鍵將顯示您可以使用的序列。在我的機器上,我得到:Backspace``Return``KP_Enter``quoted-insert``vi-quoted-insert``^V``Control``v``bindkey``termite

  • PgUp: ^[[5~, 這也是Control+ [, [, 5, ~or Escape, [, 5, ~or Alt+ [, 5,~
  • Backspace: ^?, 這也是Control+?
  • Return: ^M, 這也是Control+m
  • KP_Enter: ^[OM, 這也是Control+ [, Shift+ o, Shift+mAlt+ Shift+ o, Shift+m

理論上,密鑰序列可以任意長且複雜。例如:

bindkey '^[xfooba^r' run-help

Alt+ x, f, o, o, b, a, Control+r將執行run-help小元件。

有一點限制,因為zsh在它接受多字元序列之前,它只等待另一個字元一段時間。這個超時時間可以在KEYTIMEOUT參數中配置,單位是百分之一秒。預設值為400.4 秒。

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