2011-08-24 20 views
52

我一直在尋找這個年份的解決方案。如何使bash選項卡完成行爲與vim選項卡完成一樣並通過匹配匹配循環?

因爲這個原因,我在操作文件時比vim更加高效。

,如果我有

file_12390983421 
file_12391983421 
file_12340983421 
file_12390986421 

在bash和類型file_1->標籤,它顯然列出:

file_12390983421 file_12391983421 file_12340983421 file_12390986421 

這是一個可怕的野豬和痛苦的工作。

vim中的相同序列將一次遍歷一個文件。

請別人告訴我如何在bash中做到這一點,或者如果有另一個shell可以做到這一點,我會明天切換。

+0

http://unix.stackexchange.com/questions/24419/terminal-autocomplete-cycle-through-suggestions –

+0

將'bind TAB:menu-complete'放入'.bashrc'中。 – Claudio

回答

66

默認TAB綁定到complete readline命令。您所需的行爲將改爲menu-complete。您可以通過編輯~/.inputrc來更改您的readlines設置。要重新綁定TAB,加入這一行:

TAB: menu-complete 

欲瞭解更多詳細信息,請參閱man bashREADLINE部分。

+1

這完美的作品。有一件事,有沒有辦法讓這個倒退?在vim中我使用shift + tab,如果我不小心走到遠處,我會回去,或者如果我想從列表的末尾開始。我在vim中整天做的事情......但似乎不適用於菜單完成。 – pixelearth

+6

menu-complete將自動替換您的輸入,但不會顯示候選列表。有兩種方法可以做到嗎? – leon

+12

@pixelearth:還有'menu-complete-backward',並且至少在我的終端上,Shift-Tab似乎發送了'\ e [Z'轉義序列。這給你這個.inputrc條目:'「\ e [Z」:menu-complete-backward' – sth

3

感謝@sth我找到了最適合我:

爲了保持正常的bash選項卡完成,然後通過使用CTL-F循環使用菜單完成

在把這個需要你的時候.inputrc文件文件:

"\C-f": menu-complete 
13

# cycle forward 
Control-k: menu-complete 
# cycle backward 
Control-j: menu-complete-backward 

頂部,你也可以考慮加入

# display one column with matches 
set completion-display-width 1 

這樣,您將保存當前選項卡的功能,使慶典在一列中顯示的可能性。因此,而不是

file_12340983421 file_12390983421 file_12390986421 file_12391983421 

,你會得到

file_12340983421 
file_12390983421 
file_12390986421 
file_12391983421 

附:您可以從此The GNU Readline Library網站獲取最新的readline圖書館。

0

以我的經驗,提供的答案解決方案從來沒有完全爲我工作。 TL; DR:將set -o vi添加到您的~/.bashrc

當使用菜單完成與六鍵綁定一起,我必須確保

set -o vi 

某處顯示在我的~/.bashrc。對我來說,這是從來沒有足夠的

TAB: menu-complete 

set editing-mode vi 
set keymap vi 

在我的~/.inputrc

我的猜測是,不知何故set editing-modeset keymap被重挫的TAB: ...設置,但我還沒有研究的文檔徹底弄清楚爲什麼是這樣的情況。

+0

我沒有找到TAB命令。我嘗試設置編輯模式和鍵盤映射到vi,但仍然沒有任何東西,在我的inputrc macOS上找不到bash命令 –

+1

@MladenPetrovic - 第一個'set ...'部分進入〜/ .bashrc',第二個'TAB: ...'部分進入'〜/ .inputrc'。如果將該部分放在'〜/ .bashrc'中,你會得到'TAB command not found'。 –

0

對於bash> = 4,你可能會喜歡這些設置:

# If there are multiple matches for completion, Tab should cycle through them 

bind 'TAB':menu-complete 

# Display a list of the matching files 

bind "set show-all-if-ambiguous on" 

# Perform partial completion on the first Tab press, 
# only start cycling full results on the second Tab press 

bind "set menu-complete-display-prefix on" 

此設置類似於Vim的set wildmode=longest:full:list,full

我從this question在UNIX & Linux的網站拉到這些設置。