你怎么得到一个bash函数来自动完成,就好像它是其他的东西?

时间:2016-03-30 16:27:32

标签: git bash function autocomplete alias

git checkout的正常自动完成可能会显示您可以自动完成的分支列表。如何为包含git checkout的函数添加相同的自动完成行为?

假设:

function git_checkout () {
  git checkout $1
  do_some_custom_other_stuff
}

如何使git_checkout功能自动填充与git checkout相同?

1 个答案:

答案 0 :(得分:3)

如果您运行complete -p git,您可以看到git本身的默认完成情况。

$ complete -p git
complete -o bashdefault -o default -o nospace -F __git_wrap__git_main git

这里重要的部分是-F __git_wrap__git_main位。

如果您检查__git_wrap__git_main功能:

$ type __git_wrap__git_main
__git_wrap__git_main is a function
__git_wrap__git_main ()
{
    __git_func_wrap __git_main
}

您可以看到它只是通过__git_main函数调用__git_func_wrap函数。 (如果需要,你可以自己检查一下。)

查看__git_main函数,您会看到它尝试根据正在运行的命令查找_git_XXX函数,当然,还有_git_checkout函数(type -t _git_checkout {1}} == function)。

该功能为git checkout提供完成支持。那就是你想要的自定义功能。这就是你完成使用所需的功能。

你不能直接调用它,记住它需要从__git_func_wrap调用启动这一切的一些设置,所以你需要自己包装它。

这正是我们开始使用的__git_wrap__git_main函数(对于__git_main)本身。

所以我们写一个像我们这样的函数:

__git_wrap_git_checkout() {
    __git_func_wrap _git_checkout
}

然后将其作为函数的完成函数挂钩:

complete -o bashdefault -o default -o nospace -F __git_wrap_git_checkout git_checkout

我们应该好好去。

将此函数实现为git别名而不是独立的shell函数意味着我们可以利用内置的git完成支持,提供_git_git_checkout函数(与我们上面的__git_wrap_git_checkout函数相同,并以_git_ + alias_name的方式命名,这是__git_main所期望的),git会自动进行调用。