您如何获得bash函数来自动完成功能,就像其他功能一样?

wya*_*iga 3 git bash alias autocomplete function

正常的自动完成功能git checkout可能是显示分支列表,然后可以自动完成。如何为包装的函数添加相同的自动完成行为git checkout

假设地:

function git_checkout () {
  git checkout $1
  do_some_custom_other_stuff
}
Run Code Online (Sandbox Code Playgroud)

如何使它git_checkout自动完成功能git checkout呢?

Eta*_*ner 5

如果运行complete -p git,则可以看到默认完成git本身是什么。

$ complete -p git
complete -o bashdefault -o default -o nospace -F __git_wrap__git_main git
Run Code Online (Sandbox Code Playgroud)

这里的重要部分是-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
}
Run Code Online (Sandbox Code Playgroud)

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

查看该__git_main函数,您会发现它尝试_git_XXX根据正在运行的命令来查找函数,并且确实有一个_git_checkout函数(type -t _git_checkout== function)。

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

但是,您不能直接调用它,请记住,它需要从__git_func_wrap启动所有操作的调用中进行一些设置,因此您需要自己包装它。

这正是__git_wrap__git_main我们开始使用的功能__git_main本身(for )的功能。

因此,我们自己编写了一个这样的函数:

__git_wrap_git_checkout() {
    __git_func_wrap _git_checkout
}
Run Code Online (Sandbox Code Playgroud)

然后将其作为功能的完成功能:

complete -o bashdefault -o default -o nospace -F __git_wrap_git_checkout git_checkout
Run Code Online (Sandbox Code Playgroud)

而且我们应该很好走。


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