对于 git 别名,git 命令 ( __git()
) 的自动完成功能使用调用git config --get "alias.$1"
来确定等效的自动完成功能。这适用于简单的映射,但会阻塞更复杂的别名。
要解决此问题,请定义一个名称与您的别名匹配的自动完成函数,即_git_tagarchive()
. git 的自动完成功能应该选择它并将其用于自动完成。
例如:
[me@home]$ git tagarchive <TAB><TAB>
AUTHORS gentleSelect/ .gitignore LICENSE test_multiple.html
cron/ .git/ index.html README.md
[me@home]$ _git_tagarchive() {
> _git_branch # reuse that of git branch
> }
[me@home]$ git tagarchive <TAB><TAB>
enable_multiple master origin/gh-pages v0.1 v0.1.3
FETCH_HEAD ORIG_HEAD origin/HEAD v0.1.1 v0.1.3.1
HEAD origin/enable_multiple origin/master v0.1.2
要获得更持久的解决方案,只需将函数定义添加到您的bashrc
文件中。例如:
_git_tagarchive()
{
_git_branch
}
请注意,我只是将自动完成功能重用于git branch
; 您可能希望将其更改为更合适的内容或编写您自己的内容。
更多信息
该解决方案是基于对/etc/bash_completion.d/git
.
通常,别名 git 命令由__git_aliased_commands()
解析输出git config --get "alias.$1"
以决定要使用的自动完成功能的函数处理。可以理解,使用更复杂的 shell 命令作为别名目标会挫败这种方法。
_git()
进一步看,通过简单地在函数前面加上_git_
(命令中的破折号(-
)替换为下划线),它似乎在子命令的自动完成功能中出现了 git ( ) 链的自动完成功能。这是在__git_aliased_command()
检查之前完成的,所以这是我们可以使用的。
_git ()
{
# .....
local completion_func="_git_${command//-/_}"
declare -f $completion_func >/dev/null && $completion_func && return
local expansion=$(__git_aliased_command "$command")
if [ -n "$expansion" ]; then
completion_func="_git_${expansion//-/_}"
declare -f $completion_func >/dev/null && $completion_func
fi
}
因此,我采用的方法是确保存在与您的别名匹配的函数,即_git_tagarchive()
.