我正在编写一个名为的 CLI 实用程序环境集,其用法如下:envset [ENVSET-OPTIONS] [SETNAME] [--] [CMD] [ARGS]...
.
它基本上运行一个带有配置文件中定义的一组环境变量的命令(已经有一个npm 包具有相同的名称,但我正在使用不同的功能集在 Perl 中实现我的实用程序)。
我想为 提供制表符补全envset
。完成由 shell 函数处理_envset
。如果像下面这样(^
表示按下时光标的位置),那就太好了Tab
:
% envset mycolors -- ls -^
_envset
可以返回完整答案ls
(因此,返回可能的 ls 命令行选项列表)。有没有一种简单的方法可以让 bash 帮我归还它们?
否则,我必须做类似以下的事情_envset
(这并不完美,但对于大多数情况来说应该足够好了):
解析 的输出
complete
以查找描述命令(在上面的示例中为ls
)如何完成的条目。如果没有,则查找带有-D
(默认处理程序)的条目。如果命令由函数 (-F) 完成,则调用该函数(在适当设置 COMP_WORDS 和 COMP_CWORD 后)。从函数返回 COMPREPLY。
如果该命令由外部命令(-C)完成,则运行该命令(在适当设置 COMP_LINE 和 COMP_POINT 后)。捕获输出线并设置 COMPREPLY。
对于其他类型的处理程序(-W、-G 等),依此类推。我认为处理 -F、-C、-W 和 -A 应该涵盖大多数情况。
对于默认处理程序,有一种特殊情况,它返回 124,这意味着我们必须从步骤 1 重新启动,以查看处理程序是否已
complete
为我们想要的命令定义。