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

Is it possible to modify compopts dynamically from an external completion command?

我正在用 Golang 编写 bash 补全程序。事实上,该程序是它自己的完成程序,因为它会查找 COMP_LINE 环境变量,如果存在,它会输出完成选项,如果不存在,则继续执行 运行 主程序。

完成后安装如下:

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

这很好用。对于我的大部分完成,我希望在单词完成后添加一个 space,但是对于一些标志,我不希望发生这种情况。

当完成定义时,您可以设置一个-o nospace选项来在完成一个单词时省略结尾的space。但是,所有需要 space 的补全都必须明确添加到补全单词列表中。

有什么方法可以让我的程序根据返回的完成情况动态修改完整的选项?这是否公开为完成命令可以设置的环境变量?

我想避免必须将 space 附加到所有其他完成,只是为了避免在边缘情况下出现一个我不希望发生这种情况的标志。

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

["-o"]

你return:

["-o","-o "]

我在完成路径时也使用了这个技巧。为了允许用户通过 "drilling down" 完成路径,当有一个目录匹配时,我输出:

["dirname/","dirname/ "]

因此用户可以再次 Tab 以向下钻取内部路径,而不是在 "dirname/ " 之后获得 space 并且必须返回 space 并再次 Tab。