zsh 사용자 정의 완성 스크립트와 compsys/zstyle 구성 간의 관계

zsh 사용자 정의 완성 스크립트와 compsys/zstyle 구성 간의 관계

cheatzsh를 사용하라는 메시지가 표시될 때 자동으로 인수를 완성 하는 명령에 대한 간단한 완성 스크립트를 작성했습니다 cheat.
(분명히) 이것은 compinit / compsys 호환 방식으로 설정되어야 합니다:

문서:~/system/dev_resources/zsh_comp/_cheat

#compdef cheat

[bulk of code...]

# make call into compsys to provide completion!
_describe 'values' comp_cands_arr

다음과 같은 방법으로 zsh 스크립트를 사용하십시오 ~/.zshrc.

fpath=(~/system/dev_resources/zsh_comp $fpath)
autoload -U ~/system/dev_resources/zsh_comp/*(:t)

완료 스크립트가 제대로 작동합니다. 문제가 없습니다. 이제 내장을 통해 이 완성 스크립트를 참조하고 구성하고
싶습니다 . 이것zstyle
완전한 시스템 구성zsh의 섹션CommScope 시스템 문서우리에게 말해주세요:

명령줄 어딘가에서 완료를 시도하면 완료 시스템이 컨텍스트 [...]
필드를 항상 순서대로 작성하기 시작합니다
.
:완료:기능:완료:명령:매개변수:레이블

그리고

[완성자] 현재 활성화된 완성자, 선행 밑줄이 없는 함수 이름 및 기타 밑줄이 하이픈으로 변환됩니다. "완성자"는 완성이 수행되는 방식을 완전히 제어할 수 있습니다.

제 질문은 내 zsh 완성 스크립트가 _cheat컨텍스트 문자열에서 "완성자"로 간주됩니까? 입니다. 즉 이것이 정확하거나 적용 가능한가?

:completion:function:cheat:command:argument:tag
                     ^^^^^

작동하는 것처럼 보이지만 동시에 _cheat스크립트는 공식적으로 쉘 함수로 정의되지 않고 단지 느슨한 명령 모음일 뿐입니다...

답변1

당신의 _cheat파일하다라는 함수를 정의합니다 _cheat. 함수의 코드( )를 표시하여 echo $functions[_cheat]이를 확인할 수 있습니다. 함수가자동 로드파일에서 파일에는 마치 _cheat () {파일 내용 앞과 }파일 내용 뒤인 것처럼 함수의 코드가 포함됩니다. (Zsh는 또한 "ksh 스타일" 자동 로딩을 지원합니다. 여기서 파일에는 함수 정의와 함수 자체에 대한 호출이 포함되어야 합니다.)

마법의 첫줄#compdef시스템 초기화가 완료되면 파일에서 찾는 것은 파일 이름(및 자동 로드 기능)과 해당 기능에서 사용할 명령 이름이 어디에 있는지 $fpath호출하는 것과 같습니다 . 연관은 연관 배열( )에 기록됩니다.compdef _cheat cheat_cheatcheat_comps$_comps[cheat]=_cheat

completer필드는zstyle컨텍스트 문자열선행 밑줄이 제거된 완성 함수의 이름입니다.

답변2

질문에 답할 때

내 zsh 완료 스크립트 _cheat가 컨텍스트 문자열에서 "완성자"로 간주됩니까?

대답은 다음과 같습니다.아니요
+를 ESC2사용 하여 zsh의 완료 컨텍스트를 덤프하는 경우CTRLxh

% cheat b                                                                                                                             
tags in context :completion::complete:cheat::
    values  (_describe _cheat)

cheatzsh는 세 번째/완성자 위치를 완성자 "완료"에 속하는 것으로 간주하고 네 번째 또는 위치에 할당되는 것을 볼 수 있습니다 command.
중요한 것은 이것은 명령 cheat(실제 실행 프로그램)이지 zsh 내장 함수에 의해 정의된 값인 _cheat완료 함수가 아니라는 점입니다 ._cheat
zstyle

관련 정보