bash git 自定义子命令的完成?
bash completion for git custom subcommands?
假设我在 PATH
中有一个 git-cc
可执行文件。如果 git-cc
支持 --help
,那么很容易用
提供足够的补全
complete -F _longopt git-cc
这使得 $ git-cc --<TAB>
完成(根据帮助输出)。但是 git cc --<TAB>
不会完成(即使它运行良好)。更重要的是,如果我为自定义子命令创建一个 git 别名,例如cc-sensible-defaults = cc --opt1 ...
,这也行不通,在这种情况下,简单地删除 space(git-cc
而不是 git cc
)不是一个选项。
怎么办?我试过摆弄 __git_complete [git-]cc _longopt
,但各种组合中的 none 效果很好。它似乎是为了完成 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,这确实是一个函数吗?这是某种约定吗?)
What to do?
只需定义一个函数,使用前导 _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_command () {
local command=""
local completion_func="_git_${command//-/_}"
...
if __git_have_func $completion_func
then
$completion_func
return 0
I've tried messing around with __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 -
WTH is _git_log?
_git_log
是为 git log
.
生成完成的函数
Did they mean _git_log, which is indeed a function?
是的。请参阅 __git_complete 测试是否存在带有 _main
后缀或 _
前缀或没有任何 prefix/suffix.
的函数
Is it some convention?)
是的。
假设我在 PATH
中有一个 git-cc
可执行文件。如果 git-cc
支持 --help
,那么很容易用
complete -F _longopt git-cc
这使得 $ git-cc --<TAB>
完成(根据帮助输出)。但是 git cc --<TAB>
不会完成(即使它运行良好)。更重要的是,如果我为自定义子命令创建一个 git 别名,例如cc-sensible-defaults = cc --opt1 ...
,这也行不通,在这种情况下,简单地删除 space(git-cc
而不是 git cc
)不是一个选项。
怎么办?我试过摆弄 __git_complete [git-]cc _longopt
,但各种组合中的 none 效果很好。它似乎是为了完成 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,这确实是一个函数吗?这是某种约定吗?)
What to do?
只需定义一个函数,使用前导 _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_command () {
local command=""
local completion_func="_git_${command//-/_}"
...
if __git_have_func $completion_func
then
$completion_func
return 0
I've tried messing around with __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 -
WTH is _git_log?
_git_log
是为 git log
.
Did they mean _git_log, which is indeed a function?
是的。请参阅 __git_complete 测试是否存在带有 _main
后缀或 _
前缀或没有任何 prefix/suffix.
Is it some convention?)
是的。