Bash

通過 .inputrc 將 Ci 和 TAB 鍵綁定到終端應用程序中的不同命令

  • July 16, 2021

對於我所嘗試的,TAB並且C-i在 .inputrc 中似乎意味著同樣的事情,我綁定到一個的任何內容都綁定到另一個。我知道最初,它是同一件事,並且這種行為是從舊時代繼承而來的,但是現在,除了終端仿真器之外,所有 X 應用程序都使 aC-i和 a TABpress 有所不同。

那麼有沒有辦法在我按下TAB鍵時執行終端命令(例如“完成”)並在按下時執行另一個命令C-i

(同樣的問題適用於C-mand ENTERC-zC-d以及我想通過其他方式而不是原始綁定發送的所有這些控制序列,並將我自己的命令應用於這些寶貴的鍵綁定)

順便說一句,如果你能解釋一下從按鍵到 shell 解釋的過程,這將有助於我理解。現在我知道鍵盤事件由 Xmodmap 翻譯,然後由 .inputrc 翻譯,結果由 shell 或類似的東西解釋。

我目前正在使用 Guake,有時是 gnome-terminal,作為終端模擬器。

在遵循評論中提出的連結之後,終端仿真器似乎是將TABkeysym從X伺服器轉換為的鏈元素C-i,並將其發送到bash shell,因為它不理解諸如TABENTER兄弟之類的東西。因此,配置 readline 本身將不起作用,因為它位於終端仿真器之後和 bash shell 之前。然後問題可以這樣精確:如何配置我的終端仿真器,以便將TABand C-iENTERandC-m等轉換為不同的字元序列對?也許製作TABENTER發送一個新的自定義轉義序列,稍後可以在 .inputrc 中映射到原始命令,最後能夠使用C-iC-m用於其他目的。或者離開TABandENTER並製作C-iC-m發送轉義序列。

終端模擬器將諸如“Tab按下鍵”之類的事件轉換為在終端中執行的應用程序(在您的情況下為 bash)讀取的字元序列。請參閱鍵盤輸入和文本輸出如何工作?有關此主題的更詳細介紹。

由於歷史原因,一些鍵發送的字元與按下Ctrl其他字元相同:Tab= Ctrl+ IReturn= Ctrl+ MEsc= Ctrl+ [。這是因為歷史的物理終端是這樣做的,所以在終端中執行的應用程序期望它,所以終端會這樣做。

Guake 和 Gnome-terminal 都使用VTE 庫,它不允許配置從鍵和弦到字元序列的映射。您遇到與 bash 相同的問題- 使用 control+alt+space 的鍵序列綁定錯誤

Xterm具有完全可配置的鍵綁定。您可以使Tab鍵發送製表符(這是預設值),或使其發送字元串hello,或任何您選擇的。Xterm 是通過X 資源配置的。例如,要在按下和釋放時Tab發送轉義序列,請將其放在您的:\e[t``\e]t``~/.Xresources

XTerm.vt100.translations: #override \
 <Key>Tab: string("\033[t") \n\
 <KeyRelease>Tab: string("\033]t") \n\

或者,也許您會離開Tab發送製表符並 make Ctrl+I發送其他內容:

XTerm.vt100.translations: #override \
 Ctrl~Meta~Shift<Key>I: string("\033[a5i") \n\
 Ctrl~Meta Shift<Key>I: string("\033[a6i") \n\

然後,您可以\e[a5i使用可配置的鍵綁定綁定到 bash 和其他終端應用程序中的任何內容。

請注意,按照慣例,多字元轉義序列以轉義字元開頭(通常表示為\e\033\x1b在程式語言和配置文件中);某些應用程序可能會遇到以其他字元開頭的轉義序列的問題,當然您不能擁有既是轉義序列又是自己的鍵的字元,除非您願意接受超時(這就是它的工作原理viEsc等應用程序本身就綁定了某些功能)。如果您定義自己的鍵序列,請注意不要與功能鍵和游標鍵發送的鍵序列發生衝突,這些鍵或多或少是事實上的標準化

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