git checkout
的正常自动完成可能会显示您可以自动完成的分支列表。如何为包含git checkout
的函数添加相同的自动完成行为?
假设:
function git_checkout () {
git checkout $1
do_some_custom_other_stuff
}
如何使git_checkout
功能自动填充与git checkout
相同?
答案 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会自动进行调用。