zsh의 강제 로딩 완료 기능(Tab을 눌러 강제 실행하지 않아도 됨)

zsh의 강제 로딩 완료 기능(Tab을 눌러 강제 실행하지 않아도 됨)

기존 zsh 완성 함수를 대체하고 원래 함수에 대한 참조를 유지하고 싶습니다.(여기에서). 예를 들어 탭 완성이 항상 nice명령줄의 첫 번째 단어로 제안되도록 하려면 다음을 수행하세요 .

eval "$(declare -f _normal | sed '1s/.*/_original&/')"
_normal() {
  if [[ $CURRENT == 1 ]] ; then
    # suggest only "nice" as first word
    _wanted commands expl "be nice" compadd nice
  else
    # do normal completion afterwards
    _original_normal
  fi
}

지금 내가 이해한 바에 따르면 문제는 새 zsh가 _normal아직 로드되지 않았다는 것입니다.

PROMPT> functions _normal
_normal () {
    # undefined
    builtin autoload -XUz
}

그러나 처음으로 ⇥를 클릭하면 로드됩니다.

PROMPT> functions _normal
_normal () {
    local _comp_command1 _comp_command2 _comp_command skip
    if [[ "$1" = -s ]]
    then
        skip=(-s) 
    else
        skip=() 
        _compskip='' 
 <snap>

이는 해당 비트만 기록된 다음 로드할 수 없기 때문에 위의 재정의를 _normal내 .zshrc에서 수행할 수 없음 을 의미합니다 ( .zshrc에 파일이 없음 ).builtin autoload_original_normal_original_normalfpath

강제로딩하는 방법이 있나요 _normal?

_normal추신: 이전에 탭을 클릭한 후 셸에서 이 작업을 수행하면 작업이 재정의되는 것 같습니다.

답변1

zsh에서는 +X플래그를 전달하여 autoload함수를 $fpath실행하지 않고 로드할 수 있습니다.

또한 배열을 조작하여 함수를 새 이름으로 복사할 수 있습니다 functions.

autoload -Uz +X _normal
functions[_original_normal]=$functions[_normal]
_normal () {
}

답변2

이제 나는 달린다

_normal &> /dev/null || true

_normal다른 완성과 마찬가지로 일반적으로 셸에서 직접 호출하면 안 되며 (리디렉션 없이) 오류 메시지가 표시됩니다.

_default:compcall:12: 완성 함수에서만 호출할 수 있습니다.

이러한 호출은 오류 코드를 반환하지 않으므로 이는 || true불필요한 것 같습니다 ._normal

관련 정보