如何使bash选项卡完成表现得像vim选项卡完成并循环匹配匹配?

时间:2011-08-24 17:22:55

标签: bash shell vim

我一直想为YEARS找到解决方案。

由于这个原因,我在操作文件时比bash更有效率。

如果我有

file_12390983421
file_12391983421
file_12340983421
file_12390986421

在bash中输入file_1->标签,它显然列出了:

file_12390983421 file_12391983421 file_12340983421 file_12390986421

这是一个可怕的工作和痛苦的工作。

vim中的相同序列将一次循环一个文件。

请有人告诉我如何在bash中执行此操作,或者如果有另一个shell可以执行此操作,我明天会切换。

5 个答案:

答案 0 :(得分:79)

默认情况下TAB绑定到complete readline命令。您期望的行为将是menu-complete。您可以通过修改~/.inputrc来更改您的阅读线设置。要重新绑定TAB,请添加以下行:

TAB: menu-complete

有关详细信息,请参阅READLINE中的man bash部分。

答案 1 :(得分:15)

对于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

我从Unix上的this question中提取了这些设置。 Linux网站。

答案 2 :(得分:14)

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

您也可以考虑添加

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

这样您就可以保留当前的Tab功能,并使bash在一列中显示可能性。而不是

file_12340983421 file_12390983421 file_12390986421 file_12391983421

你会得到

file_12340983421
file_12390983421
file_12390986421
file_12391983421

P.S。您可以通过此The GNU Readline Library网站获取最新的readline库。

答案 3 :(得分:6)

感谢@sth,我找到了最适合我的方式:

要保持正常的bash选项卡完成,然后使用ctl-f在需要时使用menu-complete循环

将它放在.inputrc文件中:

"\C-f": menu-complete

答案 4 :(得分:0)

根据我的经验,我在答案中提供的解决方案对我来说从未完全奏效。 TL; DR :将set -o vi添加到您的~/.bashrc

将menu-complete与vi键绑定结合使用时,我必须确保~/.bashrc具有:

set -o vi

对于我的~/.inputrc来说,仅仅拥有:

是不够的
TAB: menu-complete

set editing-mode vi
set keymap vi

我的猜测是set editing-modeset keymap以某种方式破坏了TAB: ...设置,但我没有彻底查看文档以找出原因。