git checkout
的正常自动完成可能是显示一个分支列表,然后您可以自动完成这些分支。我该怎么做才能为包装 git checkout
的函数添加相同的自动完成行为?
假设:
function git_checkout () {
git checkout $1
do_some_custom_other_stuff
}
如何使 git_checkout
函数像 git checkout
一样自动完成?
最佳答案
如果你运行 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_func_wrap
函数调用了__git_main
函数。 (如果需要,您可以自己检查一下。)
查看 __git_main
函数,您会看到它尝试根据正在运行的命令查找 _git_XXX
函数,果然,有一个 _git_checkout
函数(type -t _git_checkout
== 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 会自动进行调用。
关于git - 你如何让 bash 函数像其他东西一样自动完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36314565/