基於git的函式的zsh自動補全,為什麼compdef在.zshrc中不起作用?
我有一個別名
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'
我想完成所有這些,,,
g
和git-all
,ga
就像 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 && compinit
mycompdef
s 放在 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