我能否通过扩展名来过滤文件并进行标签补全?

12

假设 myprogram 只会将 *.data 文件作为命令行参数输入。在终端中,当我们执行以下命令:

$ myprogram <tab>

我们只希望在制表符自动完成时列出*.data文件。如何实现这种行为?所使用的shell是Bash。

2个回答

14

选项 1

在bash shell中输入以下内容:

complete -f -X '!*.data' myprogram

-f 选项告诉 complete 只基于文件名而不是目录进行自动补全。 -X 选项允许您指定过滤模式。

选项 2

注意:此解决方案是全局的。它将影响每个目录和每个命令的标签补全(包括像 cdrm 这样的命令,以及 myprogram)。它的工作原理是允许您指定不会出现在标签补全中的文件扩展名。这不完全符合您的要求,但如果工作目录中除了 *.data 之外没有太多文件,则排除所有选项并不会太麻烦。出于这两个原因,这个选项可能不是您想要的,但还是值得注意的。

在文件 ~/.bash_profile 中添加以下行:

FIGNORE=".py:.txt:.out:.exe:.c:<etc>"

为了忽略指定的文件扩展名,语法是创建一个以冒号分隔的文件扩展名列表。保存新的.bash_profile后,您必须键入. ~/.bash_profile才能使所做的更改生效。

更多信息

有关完整命令的更多信息,请查看Bash手册中的可编程完成内置


2
有关complete命令的更多信息,请访问http://www.gnu.org/software/bash/manual/html_node/Programmable-Completion-Builtins.html。 - Dsel
1
那个 <etc> 是指“任何其他你想要的东西”,还是在 FIGNORE 中有特殊含义并且要按字面意思解释? - Daniel C. Sobral
2
无论你想要什么 - Dsel

3

建议使用 _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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接