Zshはgitベースの機能オートコンプリートを使用します。 compdefが.zshrcで動作しないのはなぜですか?

Zshはgitベースの機能オートコンプリートを使用します。 compdefが.zshrcで動作しないのはなぜですか?

エイリアスは次gitのように定義されています。

alias g=git

これと私のzshと抗原setupgと同じオートコンプリート機能を使用してください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-allgagit

これ文書説明する

1つのコマンド(たとえばcmd1)にすでに定義されているコンプリートを持つ他のコマンド(たとえばcmd2)と同じコンプリートを適用するには、次のようにします。

compdef cmd1=cmd2

だから私は打者を打つ。

compdef git-all=git

現在のzshセッションで動作します!いいね

.zshrcしたがって、私は抗原設定(初期化する必要がありますzsh-users/zsh-completions)の後に、エイリアスと関数定義の後にcompdefを入れます。

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

私の抗原は次のとおりです

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シェルを起動します。今仕事を終えることはうまくいきません。

どうすればいいですか?インタラクティブzshシェルは.zshrcを読み取ります(ここに.zshrcを入れるとecho出力が表示されます)。抗原設定の前に compdef を置くと、compdef が定義されていないというエラーが発生しますが、最後に存在するとエラーは表示されず、機能しません。たぶん抗原が何か変なことをしているかもしれないが、それでも抗原が設定された後に完成が定義されるので、抗原がこれを台無しにしてはならないのではないだろうか?

_git 2>/dev/nullまた、提案したように.zshrcに追加してみました。ここ、またはcompdef '_dispatch git git' g推奨されるようにここ、役に立たない。

私のzshバージョンは5.8です。

ベストアンサー1

私はついにそれを見つけた。抗原があるバグのようです。まだ一つあります。質問Antigen Githubには回避策が含まれています。

私のために解決したのは、.antigen/init.zshで次の行をコメントアウトすることでした:

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

これは問題を解決する正しい方法ではなく、他のエラーが発生する可能性があることを知っていますが、kubectlを大量に使用するため、オートコンプリートが必須です。

この関数はcompdef () {}明らかに何もせず、私のものです.zshrc。引用された解決策は抗原で(再)生成されたので私には効果的ではありませんでしたが、私に効果があったのは私の.antigen/init.zsh前に置くことでした。autoload -U +X compinit && compinitcompdef.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

おすすめ記事