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

时间:2018-06-14 09:07:30

标签: bash git ubuntu tab-completion

所以我有一些我正在编写脚本的命令:

all-build.sh all-git.sh

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

但是我每个人都采用不同的命令,我希望标签完成

所以我读了一个关于制表符完成的教程,我有如下所示的all-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

这可能吗?

2 个答案:

答案 0 :(得分:4)

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

然后我们可以在官方git-completion.sh文件中观察到,用于完成git“子模块”的函数称为_git,因此我们可以通过{{1}将其传递给complete }选项,请参阅complete documentation

所以写一下

-F <function>

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

注意source /usr/share/bash-completion/bash_completion _completion_loader git complete -F _git all-git.sh 脚本可能位于您计算机的不同文件夹中。我已经使用 bash 4.3.48 Ubuntu 16.04 上测试了它。

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

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

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

答案 1 :(得分:2)

这很简单:

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

它是专门为此设计的,因此无需使其更加复杂。