假设myprogram
只使用*.data
文件作为命令行参数。在终端中,当我们执行
$ myprogram <tab>
我们想只列出*.data
文件的选项卡自动完成。这种行为是如何实现的?使用的shell是Bash
选项1
在bash shell中输入以下命令
complete -f -X '!*.data' myprogram
-f
选项告诉complete
只根据文件名完成,而不是目录。-X
选项允许您指定过滤器模式。
选项2
注意:此解决方案是全局的。它将影响每个目录和每个命令中的选项卡补全(即cd
或rm
以及myprogram
)。它的工作原理是允许您指定在tab-complete中不会出现的文件扩展名。这并不完全是您所要求的,但是如果在您的工作目录中除了*.data
之外没有很多文件,那么排除所有选项不会太麻烦。由于这两个原因,这个选项可能不是您想要的,但仍然值得注意。
在文件~/.bash_profile
中添加
FIGNORE=".py:.txt:.out:.exe:.c:<etc>"
这里的语法是创建一个以冒号分隔的要忽略的文件扩展名列表。保存新的.bash_profile
后,您必须键入. ~/.bash_profile
以使所做的更改生效。
有关完整命令的更多信息,请参阅Bash手册中的可编程完成内置程序。
最好使用_filedir
而不是"raw" complete
。
-
grep _filedir -r $(pkg-config --variable=completionsdir bash-completion) | wc -l
- 波浪(
~
)路径正在扩展 - 前缀被删除的目录,即
/home/tux/Do<TAB><TAB>
,你得到的列表作为回复删除'/home/tux',因此更紧凑 - 更容易实现和更安全的故障
兆瓦
写一个文件"completions/myprogram",由. completions/myprogram
提供源代码。内容:
_myprogram()
{
# init bash-completion's stuff
_init_completion || return
# fill COMPREPLY using bash-completion's routine
_filedir '@(data)'
}
complete -F _myprogram myprogram