创建制表符完成脚本。在一种情况下,我想将完成用于另一个命令(例如 git),这可能吗?

Creating a tab completion script. In one case I want to use the completion for another command (e.g. git), is it possible?

所以我正在编写一些命令:

全部-build.sh 全部-git.sh

这些 运行 命令在多个文件夹和 spawn 输出 windows(运行ning tail -f 在日志上)和各种其他东西。

但是我每个人都接受不同的命令,我想要制表符补全

所以我阅读了有关制表符补全的教程,并且我有全 completion.bash 脚本,如下所示:

#!/usr/bin/env bash

complete -W "param1 param2 param3" all-build.sh
complete -W "status log push pull" all-git.sh

如您所见,所有构建的自动完成参数是我自己的自定义参数,对此我很满意。但是 git 是某些实际 git 参数的重复。所以我真正想要的是:

complete <use git completion> all-git.sh

因此,当我执行 all-git submodule upd<tab> 时,它会使用 git 的自动完成功能自动完成 all-git submodule update

这可能吗?

我们可能会使用 _completion_loader,(用于动态定义完成 )以加载 git 个完成。

那我们可以在官方观察git-completion.sh file, that function used to complete git "submodules" is called _git, so we can simply pass it to complete via -F <function> option, see complete documentation.

所以写

source /usr/share/bash-completion/bash_completion
_completion_loader git

complete -F _git all-git.sh

我们可以实现预期的行为(如果我正确地解决了您的问题)。

注意bash_completion 脚本可能位于您计算机上的不同文件夹中。我已经在 Ubuntu 16.04bash 4.3.48.

上进行了测试

编辑:如果这不能完全解决您的问题,我相信这就是您想要的方式:)。您几乎可以根据需要改变解决方案。

EDIT-2:我还假设,您已经安装并运行 git 完成。

EDIT-3:我发现了一些有趣的链接,它们并没有解决您的特定问题,但可以提供一些浅显和更深入的知识:

很简单:

source /usr/share/bash-completion/completions/git
__git_complete all-git.sh __git_main

__git_complete() 函数是创建 Git 补全的助手,它被 Git 本身使用,如下所示:__git_complete git __git_main。您可以将它用于特定命令,例如 __git_complete all-submodule.sh _git_submodule.

它是专门为此设计的,因此无需将其复杂化。