我可以使选项卡完成过滤器文件的扩展名



假设myprogram只使用*.data文件作为命令行参数。在终端中,当我们执行

$ myprogram <tab>

我们想只列出*.data文件的选项卡自动完成。这种行为是如何实现的?使用的shell是Bash

选项1

在bash shell中输入以下命令

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

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

选项2

注意:此解决方案是全局的。它将影响每个目录和每个命令中的选项卡补全(即cdrm以及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

相关内容

  • 没有找到相关文章

最新更新