自動完成終端緩衝區中的單字

自動完成終端緩衝區中的單字

vim和等編輯器中emacs,可以使用C-p(vim) 或M-/(emacs) 等熱鍵使用同一緩衝區中的其他單字對目前單字執行自動補全。

是否可以在 shell 中實現相同的功能?如果我在上一個命令的輸出中看到一些單詞,並且我想在鍵入另一個命令時快速自動完成它。

為了清楚起見,舉個例子:

$ ls
Desktop/  Mail/  music/  osx@  something_with_a_pretty_long_name

$ someth

從這裡,我希望能夠按下熱鍵並讓它自動完成我正在輸入的內容something_with_a_pretty_long_name

編輯:拍攝。對於我所追求的,使用檔案名稱是一個很糟糕的例子。考慮以下第二個範例:

$ cat /var/log/something.log
[19:30] Service started
[19:35] Something else happened

$ happ

我可以將“happ”自動完成為“happened”,只是因為它出現在我的終端緩衝區中。我希望這能澄清我所追求的。

答案1

簡短的回答:不,不適合經典 shell,如zshbash通常您的 shell 和終端是不同的實體。

長答案:也許吧。典型的情況是您輸入命令並按Enter- 現在是您的 shell叉子並執行指定的命令。然後外殼有知道發生了什麼,shell 不知道將寫入終端的內容或執行的程式做了什麼,如果它啟動了其他程序,寫入您的終端或其他任何內容。

您的問題有兩種可能的解決方案:

  1. 捕獲執行命令的所有輸出,並以某種方式使用它來完成目的(可以完成,但可能不應該完成)
  2. 使用不同的終端支援‘完成’來自你的「外殼緩衝區」。

2 的解決方案是例如使用 emacs 和multi-term只是使用M-/就像你平常從終端完成事情一樣。其他終端可能提供類似的解決方案。

但你真的需要這樣的完成嗎?現在的 shell 補全可以補全手冊頁、指令、pid、套接字、指令選項、遠端系統的檔案路徑等等。這可能已經足以滿足您的用例,或者可以針對您的特定問題進行增強。

答案2

http://www.iterm2.com/#/section/features/autocomplete

iterm2 正是您所需要的。壞事是對 mac 來說。

但由於它是終端,你可以 ssh 到 linux/unix 並且它仍然可以工作。

答案3

你可以這樣做外加它使用 tmux 捕獲輸出,並讓您使用 fzf 進行模糊選擇:

外加

答案4

這可能不是您期望的答案,但它可能會滿足您的某些需求。

您可以使用 TAB 自動完成 $PATH 中的命令(或內部命令),因此如果您的檔案名稱是可執行檔並且它位於 $PATH 中,它將自動完成。

如果您想要自動完成不可執行的檔案名,您可以輸入「.」 -點,然後輸入空格(或任何代替點的內容),然後輸入檔案名稱和製表符的部分。這樣,您將欺騙 shell 相信您正在執行命令並將檔案名稱作為命令的參數。按 T​​AB 鍵將自動完成檔案名,但您可能必須刪除前面的點+空白。

另一種可能性是使用BASH補全功能。這可以自動完成的不僅僅是檔案名稱。

相關內容