对于 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()
。
[alias]
中,是的。 - bcmcfcco
(checkout
) 这样的别名对我来说很好用。已更新问题。 - bcmcfcgit
不太相关,而是更多地涉及到bash
。你可能会发现这个链接有帮助:为别名命令提供Bash自动完成。 - Yannick Blondeau