git自定义子命令的bash完成?

igetnqfo  于 2023-01-04  发布在  Git
关注(0)|答案(1)|浏览(143)

假设我在PATH中有一个git-cc可执行文件,如果git-cc支持--help,那么很容易用

complete -F _longopt git-cc

这样$ git-cc --<TAB>就完成了(根据帮助输出),但是git cc --<TAB>不会完成(即使它运行良好),更重要的是,如果我为自定义子命令创建了一个git别名,例如cc-sensible-defaults = cc --opt1 ...,那也不会起作用,在这种情况下,简单地删除空格(git-cc代替git cc)是不可行的。
怎么办?我试过摆弄__git_complete [git-]cc _longopt,但是各种组合都没有什么效果。它似乎是用来完成bash别名(如gl = git-log),而不是子命令的。正如预期的那样,git/git-completion.bash中的介绍不是很有帮助,包含了令人困惑的

# If you have a command that is not part of git, but you would still
# like completion, you can use __git_complete:
#
#   __git_complete gl git_log
#
# Or if it's a main command (i.e. git or gitk):
#
#   __git_complete gk gitk

(WTH是_git_log吗?他们的意思是_git_log吗?这确实是一个函数吗?这是某种约定吗?)

a64a0gku

a64a0gku1#

更新:
对我来说,这个解决方案只是让<tab>每次都列出所有的替代项,没有完成,为什么?我尝试了_git_jump() { COMPREPLY=(diff merge grep); }git jump d<tab>,但输出只是列出:diff grep merge-莫贝里
你要做的是从COMPREPLY中删除单词,这样只剩下一个以$cur开头的单词。如果你输入3,bash会显示列表。如果你减少COMPREPLY=(diff),它会由bash自动完成。
Taking inspiration of https://github.com/git/git/blob/master/contrib/completion/git-completion.bash#L2445 , the following works nicely:

_git_jump() { __gitcomp "diff merge grep" "" "$cur"; }

或者我认为最好自己编写类似的代码,而不是依赖git

_git_jump() { COMPREPLY=( $(compgen -W "diff merge grep" -- "${COMP_WORDS[COMP_CWORD]}") ); }

对我来说,https://devmanual.gentoo.org/tasks-reference/completion/index.html是最好的介绍如何做到这一点。
怎么办?
只需要定义一个函数,使用前导_git_前缀进行编译。

# you should rather use COMPREPLY+=(..) or call `__gitcomp` to append
$ _git_cc() { COMPREPLY=(-a -b); }
$ git cc <tab>
-a  -b  
$ git cc -

参见__git_complete_命令:

__git_complete_command () {
    local command="$1"
    local completion_func="_git_${command//-/_}"
    ...
    if __git_have_func $completion_func
        then
            $completion_func
            return 0

我尝试过用__git_complete来做一些事情
就我对__git_complete的理解而言,正好相反--你需要一个普通的命令,比如git子命令。

$ _git_cc() { COMPREPLY=(-a -b); }
$ alias mycommand='git cc'
$ __git_complete mycommand git_cc                  # or __git_complete mycommand _git_cc
$ mycommand <tab>
-a  -b  
$ mycommand -

什么是_git_log?
_git_log是为git log生成完成的函数。
他们的意思是_git_log吗,这确实是一个函数?
是的。请参见__git_complete测试,了解是否存在带_main_前缀或不带任何前缀/后缀的函数。
这是某种惯例吗?)
是的。

相关问题