cheat
zsh를 사용하라는 메시지가 표시될 때 자동으로 인수를 완성 하는 명령에 대한 간단한 완성 스크립트를 작성했습니다 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
_cheat
cheat
_comps
$_comps[cheat]=_cheat
이 completer
필드는zstyle
컨텍스트 문자열선행 밑줄이 제거된 완성 함수의 이름입니다.
답변2
질문에 답할 때
내 zsh 완료 스크립트 _cheat가 컨텍스트 문자열에서 "완성자"로 간주됩니까?
대답은 다음과 같습니다.아니요
+를 ESC2사용 하여 zsh의 완료 컨텍스트를 덤프하는 경우CTRLxh
% cheat b
tags in context :completion::complete:cheat::
values (_describe _cheat)
cheat
zsh는 세 번째/완성자 위치를 완성자 "완료"에 속하는 것으로 간주하고 네 번째 또는 위치에 할당되는 것을 볼 수 있습니다 command
.
중요한 것은 이것은 명령 cheat
(실제 실행 프로그램)이지 zsh 내장 함수에 의해 정의된 값인 _cheat
완료 함수가 아니라는 점입니다 ._cheat
zstyle