如何让 bash 自动完成通配符?

如何让 bash 自动完成通配符?

如果我有包含文件的目录

foo.bar.a.cat
foo.bar.a.hat

我输入ls f+ TABbash shell 自动完成到ls foo.bar.a..如果我输入ls *bar*+TAB我希望它自动完成为*bar*.a..这可能吗?

这看起来与问题类似

如何在 bash 中启用通配符的制表符补全?

但建议的答案“它对我来说是开箱即用的”,但事实并非如此。我也试过了TAB TAB,没有效果。命令``bash --version givesGNU bash,版本4.2.37(1)-release (x86_64-pc-linux-gnu)`。

答案1

您想要:

插入完成

ALT*对于“插入所有完成”

这样,包含文件名“aa ab ac ad”的目录
ls a*alt + *完成ls aa ab ac ad

手册页绑定条目:

插入完成 (M-*)

将文本的所有补全插入到可能补全生成的点之前。

全局扩展字

在某些系统上,上述内容不适用于通配符,以下内容对我来说在此类系统上有效:

ctrlx, *(二冲程组合)

示例:我用以下内容填充了目录:

touch {a,b,c,d,e,f}{1,2,3,4,5,6,7,8,9,0}00{a,b,c,d,f,e}

然后我ls *100*跟着ctrl + x, *,这将我的阅读行变成:

ls a100a a100b a100c a100d a100e a100f b100a b100b b100c b100d b100e b100f c100a c100b c100c c100d c100e c100f d100a d100b d100c d100d d100e d100f e100a e100b e100c e100d e100e e100f f100a f100b f100c f100d f100e f100f

手册页绑定条目:

全局扩展字 (Cx *)

point 之前的单词被视为路径名扩展的模式,并插入匹配文件名的列表,替换该单词。如果提供数字参数,则在路径名扩展之前附加“*”。

Bash 参考手册页

答案2

尝试将其添加到 ~/.inputrc 中:

set show-all-if-ambiguous on

show-all-if-ambiguously 使按 Tab 键一次(而不是两次)列出所有完成情况。它还使第一个选项卡按下插入全局表达式的共享前缀。

$ touch 1.0.{1,2}
$ echo *0* # I pressed tab once here
1.0.1  1.0.2
$ echo 1.0.

glob-complete-word (\eg) 也将完成*0*最后没有)到1.0../System/Library/Launch*/*Finde例如,它还完成了/System/Library/LaunchAgents/com.apple.Finder.plist

如果您想在上面的示例中转换*为,请使用 insert-completions (\e*) 或 glob-expand-word (\Cx*)。1.0.1 1.0.2

答案3

此问题是由“bash-completion”包中的错误引起的。

当未安装软件包时,bash 会默认完成,这是一个非常好的通用文件名完成引擎。

“bash-completion”包应该查看该行的其余部分,并“智能”地处理它生成的列表。但是,它无法成功复制“glob”扩展。

就我个人而言,我认为该软件包太过努力,最终只能由“最愚蠢的普通用户”使用。

不过,在删除它之前,您可能需要检查文件“/usr/share/bash-completion/bash_completion”的顶部,以获取 .bashrc 中的有用添加内容,以对内置 bash 完成进行“总体调整”。

顺便说一句:它有一百多个已记录的错误......https://bugs.debian.org/cgi-bin/pkgreport.cgi?package=bash-completion

相关内容