Zsh

基於git的函式的zsh自動補全,為什麼compdef在.zshrc中不起作用?

  • January 23, 2022

我有一個別名git定義為

alias g=git

有了這個和我的 zsh 和抗原設置,g具有與git.

但是,當我替換g為預設情況下顯示 git 狀態的函式時

g() {
 if [ "$#" -eq 0 ]; then
   git status --short --branch
 else
   git "$@"
 fi
}

這自然不再起作用。git-all在子目錄的所有儲存庫中執行相同 git 命令的函式也是如此

git-all() { 
 if [ "$#" -eq 0 ]; then
   find . -maxdepth 3 -type d -name .git -execdir echo \; -execdir pwd \; -execdir git status --short --branch \;
 else
   find . -maxdepth 3 -type d -name .git -execdir echo \; -execdir pwd \; -execdir git "$@" \;
 fi
}
alias ga='git-all'

我想完成所有這些,,,ggit-allga就像 for 一樣git

文件說_

如果您想要一個命令(例如 cmd1)與另一個命令(例如 cmd2)具有相同的完成,該命令已經為其定義了完成,您可以這樣做:

compdef cmd1=cmd2

所以,我輸入

compdef git-all=git

在我目前的zsh會話中,它有效!好的。

所以,我把 compdefs 放在我.zshrc的抗原設置之後,它必須zsh-users/zsh-completions初始化完成,在我的別名和函式定義之後

if [ -f ~/.antigenrc ]; then
 source ~/.antigenrc
fi

if [ -f ~/.sh_aliases ]; then
 source ~/.sh_aliases
fi

compdef g=git
compdef ga=git
compdef git-all=git

antigen apply

我的antigenrc看起來像這樣:

source /usr/share/zsh-antigen/antigen.zsh

antigen use oh-my-zsh

antigen bundle gradle/gradle-completion
antigen bundle command-not-found
antigen bundle MikeDacre/cdbk
antigen bundle zsh-users/zsh-completions
antigen bundle zsh-users/zsh-syntax-highlighting

antigen theme ys

我開始了一個新的 zsh shell。現在完成不工作。

這個怎麼可能?一個互動式 zsh shell 讀取 .zshrc (如果我放在echo那裡,我會看到輸出)。如果我將 compdef 放在抗原設置之前,我會收到有關未定義 compdef 的錯誤,但是當它們在最後時它們不會顯示錯誤,它們只是不起作用。也許抗原正在做一些奇怪的事情,但即便如此,完成是在抗原設置之後定義的,所以抗原不應該把它們搞砸嗎?

我還嘗試按照此處的建議添加_git 2>/dev/null我的 .zshrc 中,或者按照此處的建議使用compdef '_dispatch git git' g但無濟於事。

我的 zsh 版本是 5.8。

我終於弄明白了。這似乎是一個帶有抗原的錯誤。抗原 Github 上也有一個問題,其中包含一個解決方法:

對我來說,修復它的方法是在 .antigen/init.zsh 中註釋掉以下幾行:

# autoload -Uz add-zsh-hook; add-zsh-hook precmd _antigen_compinit
# compdef () {}

我知道這不是修復它的正確方法,而且它可能會導致一些其他錯誤,但我大量使用 kubectl,所以我非常需要自動完成

該函式compdef () {}顯然不做任何事情,並且在 my .zshrc. 引用的解決方法對我不起作用,因為它.antigen/init.zsh是由抗原(重新)生成的,但對我有用的是將autoload -U +X compinit && compinitmy compdefs 放在 my之前.zshrc

#type compdef #uncomment this to see the problem
autoload -U +X compinit && compinit
#type compdef #uncomment this to see the solution
compdef g=git
compdef ga=git
compdef git-all=git

引用自:https://unix.stackexchange.com/questions/670676