git - 你如何让 bash 函数像其他东西一样自动完成?

标签 git bash function autocomplete alias

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/

相关文章:

javascript - 找不到创建的函数

git - 如何忽略已提交给 Git 的文件的任何更改

linux - BASH 脚本 : take a filename (with spaces) as argument and use name (no ext) and also full filename as args for scripted command

git reset <file> 与 git reset -- <file>

bash sh 特殊参数 $@ "$@", 将 "$@"保存到一个变量

linux - 为什么我们需要执行权限,尽管我们可以使用 "bash script file"运行任何脚本而不需要它?

swift - Swift 中的土耳其身份证号码验证

c++ - 相同的函数,类层次结构的不同返回类型

git - 使用 Programmer's Notepad 2 作为 git 的编辑器

终端上的 git branch ~(END)?