Bash

關於控制鍵快捷鍵行為的問題

  • May 15, 2016

我對Ctrl-key組合在終端中的工作方式感到困惑。在 bash 手冊頁中,有多種組合,例如:

  • C-e- 走到行尾
  • C-f- 前進一個字元

等等

但是還有一些未記錄的快捷方式,例如:

  • C-j(或C-m)返回鍵。
  • C-h用於退格
  • C-i用於標籤等。

這些快捷方式只是忘記記錄了嗎?或者,因為

  • C-jLF
  • C-mCR
  • C-iTab

在 ASCII 中,這是某種“預設”行為嗎?換句話說, , 的行為C-j不是C-mC-ibash 實現*的,*而是由其他東西實現的?

另一個問題是,當我按下C-v左箭頭鍵時,^[[D螢幕上會出現。即,ESC-[-d。但是當我按下時ESC-[-d,游標不會向左移動。這是什麼原因?

編輯:

最初,我以為當我按下時C-j,鍵盤直接發送00001010到核心。但後來我決定不是這種情況,因為使用xevor之類的程序evtest,我觀察到按鍵Controlj顯示為不同的事件。所以當我按下時C-j,鍵盤不會發送00001010,但可能是多個字節。那麼這些多個字節的轉換00001010是在哪裡完成的呢?

C-m,等的行為由 bash 實現,但它們與,等C-i相同的事實是由於終端的行為。所有終端的行為都是這樣,因為所有終端一直都是這樣的,這正是應用程序所期望的。終端和應用程序之間的介面基於字元(實際上是字節),而不是鍵,因此不發送可列印字元和鍵組合的鍵必須以某種方式進行編碼。請參閱鍵盤輸入和文本輸出如何工作?有關此主題的更多資訊。另請參閱https://emacs.stackexchange.com/questions/1020/problems-with-keybindings-when-using-terminalReturn``Tab

TAB是 ASCII 中的製表符,這與ASCII中的 Ctrl+I 字元相同。其他鍵也是如此。Tab當使用者按下和按下Ctrl+時,終端都會發送該字元I。同上RET(CR) and C-m, for LFDand C-j(大多數鍵盤沒有),and for ESCand C-[. 還有BackSpacewhich 發送C-hor C-?,這是它自己的問題。

終端的配置(stty設置)也可以發揮作用,這會影響bash的一些設置(例如,在 之後stty erase @,bash 會將按下@視為退格),但不會C-mC-j送出目前行。

^[[DEsc [ D,但有資本D。如果按Esc [ D,則 bash 會看到該Left鍵,因為在termcapterminfo數據庫中聲明了游標鍵轉義序列。沒有預設綁定Esc [ d(它不是普通終端發送的轉義序列)。

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