Zsh는 git 기반 기능 자동 완성을 사용합니다. compdef가 .zshrc에서 작동하지 않는 이유는 무엇입니까?

Zsh는 git 기반 기능 자동 완성을 사용합니다. compdef가 .zshrc에서 작동하지 않는 이유는 무엇입니까?

별칭이 다음 git과 같이 정의되어 있습니다.

alias g=git

이것과 내 zsh와항원setup 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-allgagit

이것문서설명하다

하나의 명령(예: 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내 s 앞에 넣는 것이었습니다.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

답변2

제안대로Github 이슈 댓글antigen.zsh, 해결 방법(알 수 없는 결과), not에서 다음 줄을 주석 처리 해야 합니다 .antigen/init.zsh( init.zsh항원이 로드될 때마다 생성되기 때문입니다).

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

관련 정보