2

我的 .zshrc 中有一些别名函数,例如gbforgit branchgcofor git checkout。当我记得我正在创建、删除、签出等的完整分支名称时,这非常有用。但是,我注意到完成似乎不再起作用。以前,我可以做

$ git checkout m<TAB>

如果这是一个分支的名称,它将自动完成 master。但是,现在我在使用时收到以下错误:

$ gco m<TAB>
_git:15: parse error: condition expected: 1

我不确定为什么会这样。似乎可能缺少一个论点,但我不确定为什么。

编辑:

我正在为我的 .zshrc 文件设置一个别名,如下所示git branchgit checkout

alias gco='git checkout'
alias gb='git branch'
4

2 回答 2

3

经过更多的挖掘,我找到了一个针对 bash 的相同问题的解决方案,它看起来对 zsh 也同样有效。定义这两个函数后__define_git_completion__git_shortcut您将调用__git_shortcut设置别名并一次调用完成。

__define_git_completion () {
eval "
    _git_$2_shortcut () {
        COMP_LINE=\"git $2\${COMP_LINE#$1}\"
        let COMP_POINT+=$((4+${#2}-${#1}))
        COMP_WORDS=(git $2 \"\${COMP_WORDS[@]:1}\")
        let COMP_CWORD+=1

        local cur words cword prev
        _get_comp_words_by_ref -n =: cur words cword prev
        _git_$2
    }
"
}

__git_shortcut () {
    type _git_$2_shortcut &>/dev/null || __define_git_completion $1 $2
    alias $1="git $2 $3"
    complete -o default -o nospace -F _git_$2_shortcut $1
}

__git_shortcut  ga    add
__git_shortcut  gb    branch            # I use this one.
__git_shortcut  gba   branch -a
__git_shortcut  gco   checkout          # and I use this one, too.
__git_shortcut  gci   commit -v
__git_shortcut  gcia  commit '-a -v'
__git_shortcut  gd    diff
__git_shortcut  gdc   diff --cached
__git_shortcut  gds   diff --stat
__git_shortcut  gf    fetch
__git_shortcut  gl    log
__git_shortcut  glp   log -p
__git_shortcut  gls   log --stat
于 2012-06-04T21:32:51.990 回答
0

如果您希望自动完成功能也能正常工作,我相信您应该在 .gitconfig 中创建别名。但是,您必须拼写 git 命令。

[alias]
gb = branch
gco = checkout

ETC...

您还可以像这样添加别名:

git config –-global alias.gb branch

它们将附加到您的 .gitconfig

干杯

于 2012-06-04T14:59:51.233 回答