假设 myprogram
只会将 *.data
文件作为命令行参数输入。在终端中,当我们执行以下命令:
$ myprogram <tab>
我们只希望在制表符自动完成时列出*.data
文件。如何实现这种行为?所使用的shell是Bash。
假设 myprogram
只会将 *.data
文件作为命令行参数输入。在终端中,当我们执行以下命令:
$ myprogram <tab>
我们只希望在制表符自动完成时列出*.data
文件。如何实现这种行为?所使用的shell是Bash。
在bash shell中输入以下内容:
complete -f -X '!*.data' myprogram
-f
选项告诉 complete
只基于文件名而不是目录进行自动补全。 -X
选项允许您指定过滤模式。
注意:此解决方案是全局的。它将影响每个目录和每个命令的标签补全(包括像 cd
或 rm
这样的命令,以及 myprogram
)。它的工作原理是允许您指定不会出现在标签补全中的文件扩展名。这不完全符合您的要求,但如果工作目录中除了 *.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',从而更加紧凑MWE
编写文件“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
complete
命令的更多信息,请访问http://www.gnu.org/software/bash/manual/html_node/Programmable-Completion-Builtins.html。 - Dsel<etc>
是指“任何其他你想要的东西”,还是在FIGNORE
中有特殊含义并且要按字面意思解释? - Daniel C. Sobral