在zsh中使用Git tab自动补全时出现错误

26

在苹果电脑上为git设置Tab键补全时,我遇到了一些奇怪的错误,但是我找不到错误的来源。

zsh:12: command not found: ___main
_default:compcall:12: can only be called from completion function

我不确定是什么导致了错误,因为一切都设置正确了。

zstyle ':completion:*:*:git:*' script ~/.git-completion.bash
autoload -U compinit && compinit
zmodload -i zsh/complist
source ~/.git-completion.zsh

有任何想法吗?


这篇文章提到的解决方案对我有用 https://unix.stackexchange.com/a/324516/483559 - Nitish Sahu
2个回答

57
似乎 git-completion.zsh 并非为了被 source 而设计的,你可以将 git-completion.zsh 文件复制到 $fpath 中的某个位置,并将其重命名为 _git
例如:(如果您决定拥有 ~/.zsh/functions/_git
首先,您可以将 git-completion.zsh 复制到那里并将其重命名为 _git% mkdir -p ~/.zsh/functions && cp git-completion.zsh ~/.zsh/functions/_git 然后,您可以像这样拥有您的 ~/.zshrc
zstyle ':completion:*:*:git:*' script ~/.git-completion.bash
# `compinit` scans $fpath, so do this before calling it.
fpath=(~/.zsh/functions $fpath)
autoload -Uz compinit && compinit

如果我不确定,我会执行rm ~/.zcompdump来确保compinit清除其缓存。


1
你是我的英雄 :) 感谢解释。 - mhartington
2
你刚刚用一小时的搜索给我解决了问题,谢谢! - zstyle ':completion:*:*:git:*' script ~/.git-completion.bash 不再需要。 - sramzan
3
出现了相同的问题 "__git_zsh_bash_func:8:命令未找到:__git_aliased_command",但重新启动终端后问题消失了。同时请确保禁用了 "gitfast" 插件。 - androidkc
3
使用 Git 分发中的自动补全脚本需要这两个文件:https://git.kernel.org/pub/scm/git/git.git/tree/contrib/completion?h=v2.30.2 (顺便说一句,我们可以通过查看 git-completion.zsh 文件来看到它们)。 - hchbaw
我需要添加一件事:compaudit | xargs chmod g-w以避免警告zsh compinit: insecure directories, run compaudit for list. https://dev59.com/WmYr5IYBdhLWcg3wVYwg#66432105 - cs01
显示剩余3条评论

3

预先

mkdir -p ~/.zsh
cd ~/.zsh

获取完成脚本
curl -o git-completion.bash https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash
curl -o _git https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.zsh

将以下内容添加到~/.zshrc文件中。
# git completion
zstyle ':completion:*:*:git:*' script ~/.zsh/git-completion.bash
fpath=(~/.zsh $fpath)
autoload -Uz compinit && compinit

重新启动shell会话

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接