是否可以从外部完成命令动态修改compopts?

时间:2019-04-25 06:00:02

标签: bash go bash-completion

我正在用Golang写一个bash完成程序。实际上,该程序是它自己的完成程序,因为它查找COMP_LINE环境变量,如果存在,它将输出完成选项,否则,将继续运行主程序。

然后使用以下内容安装完成:

complete -C /path/to/my-program my-program

这很好。对于大多数补全,我希望在单词补全后添加一个空格,但是对于某些标志,我不希望这种情况发生。

定义补全后,可以设置-o nospace选项以在补全单词时省略尾随空格。但是,所有需要空格的补全都必须明确地将一个补全添加到补全单词列表中。

我的程序是否有任何方法可以根据返回的完成情况动态修改完成选择?这是否显示为完成命令可以设置的环境变量?

我想避免为所有其他补全添加一个空格,只是为了避免在一个不希望发生的情况下出现一个我不想让它发生的标志。

1 个答案:

答案 0 :(得分:1)

我的Perl框架(Perinci::CmdLine)也做同样的事情:脚本是它们自己的完成,使用完整的-C SCRIPTNAME SCRIPTNAME激活(当脚本在PATH中时)。与使用shell函数相比,使用外部命令完成具有优点和缺点。为了解决您遇到的问题,我输出了一个带有额外空格的虚拟答案。由于答案不只一个,bash不再自动添加空格。因此,不仅仅是返回(以JSON表示法):

["-o"]

您返回:

["-o","-o "]

在完成路径时,我也会使用此技巧。为了允许用户通过“向下钻取”来完成路径,当存在单个目录匹配项时,我输出:

["dirname/","dirname/ "]

因此用户可以再次使用Tab键向下钻取内部路径,而不必在“ dirname /”之后获取空格,而必须再次退格并再次使用Tab键。