zsh 완료: 잘못된 옵션을 사용하면 완료가 중지됩니다.

zsh 완료: 잘못된 옵션을 사용하면 완료가 중지됩니다.

내 스크립트는 foo주어진 경로의 디렉터리를 /foo/path인수로 사용하며 선택적 인수도 있습니다 -l.

다음 완료 파일이 있습니다.

#compdef foo

 _arguments : \
    '-l' \
    '*: :->directory'

 case $state in
    directory)
        _directories -W /foo/path
 ;;
 esac

완료하는 동안 다음과 같은 문제가 발생합니다.

예를 들어 잘못된(존재하지 않는) 선택적 매개변수를 사용한 다음 -cTab 키를 누르면

foo -c <TAB>

-l그런 다음 존재하지 않는 옵션에 대해 디렉토리 완성 기능이 제거된 것처럼 존재하는 옵션에 대해 자동 완성됩니다 -c.

적어도 디렉토리와 -l.

그러나 어쨌든 잘못된/존재하지 않는 옵션이 제공되는 경우 잘못된 옵션으로 계속할 수 없다는 점을 명확히 하기 위해 완료를 완전히 중지하려면 어떻게 해야 합니까?

답변1

이 코드를 사용하면 설명하는 동작을 재현할 수 없습니다. 이후 을 foo -c누르면 Tab완성된 목차가 나옵니다.

와 함께 상태를 사용할 때는 _arguments함수에서 지역 변수로 사용하는 변수를 선언해야 합니다. 이 간단한 경우에는 동일한 이름을 가진 전역 변수가 없어도 문제가 되지 않는다고 생각합니다.


로 시작하는 모든 매개변수에 대한 동작을 지정하는 방법은 없다고 생각합니다 -. 인식할 수 없는 옵션이 있을 때 완료를 비활성화하려면 매개변수(즉,words1(명령어 이름, 제외)과 $CURRENT(완성어, 제외) 사이입니다.

local context state state_descr line
typeset -A opt_args

 _arguments : \
  '-l' \
  '*: :->directory'

 local i
 for ((i = 2; i < CURRENT; i++)); do
   if [[ $words[$i] = -* && $words[$i] != -l ]]; then
     state=nothing
     break
   fi
 done

 case $state in
   directory)
     _directories -W /usr
   ;;
 esac

관련 정보