cmd
작업을 실행하는 스크립트가 있습니다. cmd
여러 디렉터리에 존재합니다. 각 인스턴스는 cmd
매개변수가 되는 자체 작업을 정의합니다.
cmd
각 사본이 필요에 따라 자체 완성 콘텐츠를 생성하기를 원합니다 .
./cmd tasks
스크립트의 각 복사본에서 사용할 수 있는 인수의 줄바꿈으로 구분된 목록을 출력합니다.
$./cmd tasks
delete
dump
help
other
다음 zsh는 _cmd
실행 시 원하는 대로 작동합니다 ./cmd
.
#compdef cmd
args=( $(./cmd tasks) )
_arguments '*: :(${args})'
그러나 해당 정의의 경로는 정적이므로 실행하거나 경로 변형을 실행하면 ./cmd
완료가 실패합니다 ./somedir/cmd
$0
와 같은 사용 가능한 트리거 명령이 완료 정의에서 누락된 것 같습니다 _cmd
.
_arguments
컨트롤을 반환하고 일부 추가 상태를 채우는 호출할 수 있는 몇 가지 메서드가 있음을 알 수 있습니다 .
local context state line state_descr
_arguments -C '*::arg:->args'
$0
그러나 이번에도 유사한 수신 명령이 채워지는 것을 본 적이 없습니다 . 이전에 완료를 생성한 적이 없으므로 _arguments
이벤트를 사용하는 것은 아마도 이 작업을 수행하는 올바른 방법이 아닐 것입니다. 이것은 이 작업을 시도하는 동안 제가 발견한 첫 번째 작업 솔루션일 뿐입니다.
완료를 트리거한 명령에서 사용 가능한 매개변수를 생성하기 위해 zsh 완료를 어떻게 정의합니까?
답변1
명령과 해당 매개변수는 다음 위치에 있습니다.words
대량으로. 그러니 전화하세요 $words[1]
.
직접 호출하는 대신 패스하세요._call_program
C
, 대체 허용 및 로케일 설정 (예: 영어 메시지, 기본 미국 날짜 형식 등) 과 같은 세부 사항을 처리합니다 .
훌륭하고 복잡한 완성 기능을 작성하는 데 필요한 대부분의 정보는 매뉴얼에 있지만, 필요한 정보가 포함된 반문장을 찾기가 어렵거나 더 나쁘게는 필요한 정보를 여러 곳에서 하나로 모으는 것이 종종 어렵습니다. 찾기가 어렵습니다. 무엇인가를 알아내는 가장 쉬운 방법은 비슷한 일을 하는 기존 완성 함수를 찾아서 그 함수가 무엇인지 읽고, 매뉴얼을 통해 함수와 변수에 대한 정보를 얻는 것입니다. 그러나 zsh와 함께 제공되는 모든 기능이 제대로 작동하는 것은 아니기 때문에 이것조차도 이상적이지는 않습니다. 예를 들어, 처음에는 _git
매우 크고 많은 내용이 포함된 예제를 확인했지만 이 특정 작업에 대해 잘못된 호출을 수행했습니다 git
. $path
따라서 여기에 좋은 예가 있습니다._gpg
:
allopts=( $(_call_program options $words[1] --dump-options) )
따라서 귀하의 경우 cmd
여러 인수를 허용하는 경우 각 인수는 작업 이름입니다(예: 호출할 수 있음 cmd dump dump tasks other
).
tasks=($(_call_program tasks $words[1] tasks))
_arguments "*:task:($tasks)"
또는 첫 번째 인수가 cmd
작업 이름이고 후속 인수가 해당 작업 이름 인 경우 _arguments
이를 구문 분석해 보겠습니다. line
옵션이 아닌 매개변수로 배열을 설정합니다 .
local context state state_descr line
typeset -A opt_args
tasks=($(_call_program tasks $words[1] tasks))
_arguments \
'--global-option[This is an example global option that goes before the task name]' \
"1:task:($tasks)" \
"*:arg:->args"
case $state in
args)
… # here $line[1] is the task name
;;
esac