执行某些命令后 Bash 自动完成功能不起作用

执行某些命令后 Bash 自动完成功能不起作用

我在 bash/Cygwin 下使用 graphViz,但是不知何故,在调用它时,bash tab 自动完成功能没有任何作用。

示例文件:

  • myGraph.graphviz是输入文件
  • myGraph.graphviz.png应该是输出文件。

制作图形的命令是

dot -T png -o myGraph.graphviz.png myGraph.graphviz

我当然想输入

点-T png -o 我的Tab.png 我的Tab

自动完成这些文件名,但什么也没发生!我可以输入并给出,但为什么输入后不起作用? bash 是否需要为我可以输入的每个命令添加额外的自动完成模块?cat myTabcat myGraph.graphvizdot

答案1

我在我的 Debian 中创建了示例文件。确实,不起作用。然后(手动完成后)也不起作用。有两个单独的问题。dot -T png -o myTabdot -T png -o myGraph.graphviz.png myTab


一般手册对于 Graphviz 程序指定:

-ooutfile
将输出写入文件输出文件。 […]

我的 Debian 中的 Bash 补全遵循字面意思:它支持,不支持。即使后者可以与 一起使用(我不知道这一点),补全也不支持它。您应该按如下方式进行:-ooutfile-o outfiledot

点-T png-omyTab

后面没有任何空格-o。在我的测试中,上述操作有效。


为了制作第二件Tab作品,我检查了/usr/share/bash-completion/completions/dot。结尾附近的相关行是:

_filedir dot

这将为您提供要进入的目录和要指定的文件,但仅限于名称以.dot或结尾的文件.DOT。也许你可以手动提供一个与此模式不匹配的文件,不会发生任何不好的事情,但是如果您依赖完成机制,则文件名应该正确结束。

事实上我完全不知道dot,我对 Bash 补全略知一二。也许这个要求没有意义,dot如果允许的话,补全会更有帮助任何文件。在这种情况下,我将原始文件复制到/etc/bash_completion.d/并修改副本,因此行

_filedir dot

函数末尾变成

_filedir

这是系统范围的更改。此更改不会影响现有 shell,因此请启动一个新 shellbash进行测试。如果您无法(或不想)修改,/etc/bash_completion.d/请参阅这个答案。它提供了一种方法来拥有您的私人(用户特定的)bash_completion.d/

请注意,此更改将允许您键入,并且补全将起作用。但是,在此特定情况下,它与内部无关,它是操作数的一般补全,即使在某些意外或无效选项(例如)之后它也会起作用。dot -T png -o myTab-odot -T png -: myTab

答案2

如果系统上有另一个dot命令安装了真正的自动完成定义,并且该命令此时不需要文件,则可能会发生这种情况。默认情况下,对于未知命令,所有参数都会获得文件自动完成,但特定命令可以设置自己的特定自动完成。检查/etc/bash_completion/etc/bash_completion.d/

PS:另一种解释是dot自动完成脚本与文档不一致,或者您的论点有错误。

相关内容