zsh는 매개변수를 생성하는 명령을 트리거하는 호출을 완료합니다.

zsh는 매개변수를 생성하는 명령을 트리거하는 호출을 완료합니다.

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_programC, 대체 허용 및 로케일 설정 (예: 영어 메시지, 기본 미국 날짜 형식 등) 과 같은 세부 사항을 처리합니다 .

훌륭하고 복잡한 완성 기능을 작성하는 데 필요한 대부분의 정보는 매뉴얼에 있지만, 필요한 정보가 포함된 반문장을 찾기가 어렵거나 더 나쁘게는 필요한 정보를 여러 곳에서 하나로 모으는 것이 종종 어렵습니다. 찾기가 어렵습니다. 무엇인가를 알아내는 가장 쉬운 방법은 비슷한 일을 하는 기존 완성 함수를 찾아서 그 함수가 무엇인지 읽고, 매뉴얼을 통해 함수와 변수에 대한 정보를 얻는 것입니다. 그러나 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

관련 정보