다른 ZSH 완료 파일에서 도우미 기능을 사용할 수 있나요?

다른 ZSH 완료 파일에서 도우미 기능을 사용할 수 있나요?

이미 ZSH 완료를 지원하는 다른 명령에 대한 래퍼인 명령에 대한 ZSH 완료 파일을 작성 중입니다. 다른 명령 완성에 정의된 "비공개" 도우미 함수를 사용하고 싶지만 이 간단한 접근 방식이 작동하지 않습니다. 지금까지 이것이 내가 시도하는 것입니다:

#compdef wrapper

_arguments ':action:(foo bar baz)' ':target:_other_command_helper_func'

명령줄에서 이 작업을 수행하려고 하면 다음과 같은 결과가 나타납니다.

_arguments:450: command not found: _other_command_helper_func

여기서 내가 원하는 대로 할 수 있나요?

답변1

비공개 기능이 없으므로 _other_command_helper_func이미 로드된 경우 작동합니다. 완료 기능은 일반적으로 자동 로드되므로 이 접근 방식을 사용하면 wrapper원래 명령의 완료가 이미 시도된 경우에만 완료가 작동한다는 의미입니다.

한 가지 해결책은 원래 명령의 완성 함수 파일을 강제로 로드하는 것이지만 이는 간단한 일이 아닙니다. autoload -X +U원래 명령을 로드하는 완성기를 사용할 수 있지만 실제로 수행하는 작업은 도우미 함수의 정의 및 기타 초기화를 포함하여 _other_command정의가 파일의 내용인 함수(원래 명령의 이름이라고 가정)를 생성하는 것입니다. _other_command메인 함수 호출을 통해.

_other_command () {
        _other_command_helper_func () {
        }

        _other_command () {
        }

        _other_command "$@"
}

그것을 분석해 볼 수 있습니다. 정의를 제어할 수 있는 경우 초기화 코드에 대해 몇 가지 가정을 할 수 있습니다. 제3자라면 위험은 더욱 커집니다. 대부분의 복잡한 완성 함수 정의 파일은 초기화 모델과 양식의 마지막 줄을 따르므로 _main_function "$@"일반적으로 다음과 같이 작동합니다.

if ((!$+functions[_other_command_helper_func])); then
  autoload +X +U _other_command
  functions[_other_command]=${functions[_other_command]%$'\n'*}
  _other_command
fi

이상한 오류가 발생하면 파서에 영향을 미치는 옵션으로 인해 발생할 수 있습니다( _git이런 방식으로 로드할 때 이 문제가 발생했습니다). 이것은 나에게 효과적입니다.

load_helper_functions () {
  emulate -LR zsh
  if ((!$+functions[$1])) || [[ $functions[$1] = 'builtin autoload'* ]]; then
    autoload +X +U $1
    functions[$1]=${functions[$1]%$'\n'*}
    $1
  fi
}
load_helper_functions _git

또는 코드에서 완료 기능을 실행 .zshrc하고 완료 컨텍스트에서 실행되지 않으므로 자동으로 차단하도록 할 수도 있습니다. _cvs 2>/dev/null예 를 들어, CVS를 사용할 때 이 문제가 발생했습니다 .zshrc.

원래 정의를 제어할 수 있는 경우 더 나은 솔루션이 있습니다. 원래 명령과 래퍼 모두에 대해 동일한 완료 함수를 사용할 수 있습니다( $service어떤 명령의 인수가 완료되고 있는지 확인하세요). 또는 별도의 파일에서 도우미 함수를 정의할 수 있습니다.

관련 정보