我可以通过扩展名制作制表符完成过滤器文件吗?

时间:2015-08-24 18:17:08

标签: bash unix command-line

假设myprogram仅使用*.data个文件作为命令行参数。在终端,我们做的时候

$ myprogram <tab>

我们只希望为标签自动完成列出*.data个文件。这种行为是如何实现的?正在使用的shell是Bash。

2 个答案:

答案 0 :(得分:7)

选项1

在bash shell中键入以下内容

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

-f选项告诉complete仅基于文件名而不是目录完成。 -X选项允许您指定过滤器模式。

选项2

注意:此解决方案是全球性的。它会影响每个目录和每个命令的tab-completion(意味着cdrm以及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