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

pix*_*rth 71 vim bash shell

我一直想为YEARS寻找解决方案.

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

如果我有

file_12390983421
file_12391983421
file_12340983421
file_12390986421
Run Code Online (Sandbox Code Playgroud)

在bash和type file_1-> tab中,它显然列出:

file_12390983421 file_12391983421 file_12340983421 file_12390986421
Run Code Online (Sandbox Code Playgroud)

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

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

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

sth*_*sth 81

默认情况下TAB绑定到completereadline命令.menu-complete相反,你想要的行为.您可以通过编辑更改您的阅读线设置~/.inputrc.要重新绑定TAB,请添加以下行:

TAB: menu-complete
Run Code Online (Sandbox Code Playgroud)

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

  • @pixelearth:还有`menu-complete-backward`,至少在我的终端上,Shift-Tab似乎发送了`\ e [Z`转义序列.这给你这个.inputrc条目:`"\ e [Z":menu-complete-backward` (14认同)
  • menu-complete将自动替换您的输入,但不会显示候选列表.有办法做到这两点吗? (8认同)
  • 不确定这是否仍然相关,但我遇到了与James M. Lay相同的问题并通过在我的`.inputrc`中添加'Tab:complete"\ e [Z":menu-complete`来解决它.这样,`Tab`具有原始行为,并且`Shift` +`Tab`允许您循环建议.编辑:在"Tab:complete"之后应该有一个换行符.我无法在评论中对此进行适当的设计. (4认同)
  • 如果您可以循环浏览各种可能性并查看各种可能性的清单(例如在vim中),那真是太酷了。遍历目录中的每个可能的文件名只是为了查找完成命令后的内容,这很痛苦。 (2认同)

joe*_*dle 17

对于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"
Run Code Online (Sandbox Code Playgroud)

此设置类似于Vim set wildmode=longest:full:list,full

我在Unix和Linux网站上从这个问题中提取了这些设置.

  • 如果您使用的是 Mac OS X,请检查您的 `bash --version`。我的 Mac 只有 bash 版本 3,不幸的是,这意味着最后两个绑定将无效。 (2认同)
  • 我在 /sf/answers/3850780111/ 上有关于在 macOS 上获取最新的“bash”(当前为 5.0.2)的答案 (2认同)
  • 此配置需要位于 .bashrc 中(其他一些答案提到了 .inputrc)。 (2认同)

Joh*_*ney 14

在之上

# cycle forward
Control-k: menu-complete
# cycle backward
Control-j: menu-complete-backward
Run Code Online (Sandbox Code Playgroud)

你也可以考虑加入

# display one column with matches
set completion-display-width 1
Run Code Online (Sandbox Code Playgroud)

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

file_12340983421 file_12390983421 file_12390986421 file_12391983421
Run Code Online (Sandbox Code Playgroud)

你会得到的

file_12340983421
file_12390983421
file_12390986421
file_12391983421
Run Code Online (Sandbox Code Playgroud)

PS您可以readline从这个GNU Readline Library网站获取最新的库.


pix*_*rth 6

感谢@sth我发现最适合我的方法:

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

把它放在.inputrc文件中:

"\C-f": menu-complete
Run Code Online (Sandbox Code Playgroud)