假设我在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吗?这确实是一个函数吗?这是某种约定吗?)
1条答案
按热度按时间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
:对我来说,https://devmanual.gentoo.org/tasks-reference/completion/index.html是最好的介绍如何做到这一点。
怎么办?
只需要定义一个函数,使用前导
_git_
前缀进行编译。参见__git_complete_命令:
我尝试过用__git_complete来做一些事情
就我对
__git_complete
的理解而言,正好相反--你需要一个普通的命令,比如git子命令。什么是_git_log?
_git_log
是为git log
生成完成的函数。他们的意思是_git_log吗,这确实是一个函数?
是的。请参见__git_complete测试,了解是否存在带
_main
或_
前缀或不带任何前缀/后缀的函数。这是某种惯例吗?)
是的。