通過 .inputrc 將 Ci 和 TAB 鍵綁定到終端應用程序中的不同命令
對於我所嘗試的,
TAB
並且C-i
在 .inputrc 中似乎意味著同樣的事情,我綁定到一個的任何內容都綁定到另一個。我知道最初,它是同一件事,並且這種行為是從舊時代繼承而來的,但是現在,除了終端仿真器之外,所有 X 應用程序都使 aC-i
和 aTAB
press 有所不同。那麼有沒有辦法在我按下
TAB
鍵時執行終端命令(例如“完成”)並在按下時執行另一個命令C-i
?(同樣的問題適用於
C-m
andENTER
、C-z
、C-d
以及我想通過其他方式而不是原始綁定發送的所有這些控制序列,並將我自己的命令應用於這些寶貴的鍵綁定)順便說一句,如果你能解釋一下從按鍵到 shell 解釋的過程,這將有助於我理解。現在我知道鍵盤事件由 Xmodmap 翻譯,然後由 .inputrc 翻譯,結果由 shell 或類似的東西解釋。
我目前正在使用 Guake,有時是 gnome-terminal,作為終端模擬器。
在遵循評論中提出的連結之後,終端仿真器似乎是將
TAB
keysym從X伺服器轉換為的鏈元素C-i
,並將其發送到bash shell,因為它不理解諸如TAB
和ENTER
兄弟之類的東西。因此,配置 readline 本身將不起作用,因為它位於終端仿真器之後和 bash shell 之前。然後問題可以這樣精確:如何配置我的終端仿真器,以便將TAB
andC-i
、ENTER
andC-m
等轉換為不同的字元序列對?也許製作TAB
並ENTER
發送一個新的自定義轉義序列,稍後可以在 .inputrc 中映射到原始命令,最後能夠使用C-i
和C-m
用於其他目的。或者離開TAB
andENTER
並製作C-i
和C-m
發送轉義序列。
終端模擬器將諸如“
Tab
按下鍵”之類的事件轉換為在終端中執行的應用程序(在您的情況下為 bash)讀取的字元序列。請參閱鍵盤輸入和文本輸出如何工作?有關此主題的更詳細介紹。由於歷史原因,一些鍵發送的字元與按下
Ctrl
其他字元相同:Tab
=Ctrl
+I
、Return
=Ctrl
+M
、Esc
=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
發送製表符並 makeCtrl
+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
等應用程序本身就綁定了某些功能)。如果您定義自己的鍵序列,請注意不要與功能鍵和游標鍵發送的鍵序列發生衝突,這些鍵或多或少是事實上的標準化。