假设myprogram
仅使用*.data
个文件作为命令行参数。在终端,我们做的时候
$ myprogram <tab>
我们只希望为标签自动完成列出*.data
个文件。这种行为是如何实现的?正在使用的shell是Bash。
答案 0 :(得分:7)
在bash shell中键入以下内容
complete -f -X '!*.data' myprogram
-f
选项告诉complete
仅基于文件名而不是目录完成。 -X
选项允许您指定过滤器模式。
注意:此解决方案是全球性的。它会影响每个目录和每个命令的tab-completion(意味着cd
或rm
以及myprogram
)。它的工作原理是允许您指定不会出现在tab-complete中的文件扩展名。这并不是您要求的,但如果您的工作目录中没有*.data
以外的许多文件,则排除所有选项并不会太麻烦。由于这两个原因,这个选项可能不是你想要的,但仍然值得注意。
在文件~/.bash_profile
中添加第
FIGNORE=".py:.txt:.out:.exe:.c:<etc>"
语法是创建一个以冒号分隔的要忽略的文件扩展名列表。保存新.bash_profile
后,您必须输入. ~/.bash_profile
才能使更改生效。
有关完整命令的详细信息,请查看Bash手册中的Programmable Completion Builtins。
答案 1 :(得分:1)
最好使用_filedir
代替“原始” complete
。
正当化
grep _filedir -r $(pkg-config --variable=completionsdir bash-completion) | wc -l
~
)路径正在扩展/home/tux/Do<TAB><TAB>
的前缀,作为答复得到的列表删除了'/ home / tux',因此更加紧凑MWE
编写一个文件“完成/我的程序”,该文件由. completions/myprogram
提供。内容:
_myprogram()
{
# init bash-completion's stuff
_init_completion || return
# fill COMPREPLY using bash-completion's routine
_filedir '@(data)'
}
complete -F _myprogram myprogram