두 개의 완성 목록 중에서 선택하세요

두 개의 완성 목록 중에서 선택하세요

일부 tcsh 완료 설정을 zsh로 마이그레이션하려고 하는데 문서에서 약간의 내용을 잃어버렸습니다. 내가 원하는 것은 두 가지 방법 중 하나로 논쟁을 완성하는 것입니다. 현재 완성하려는 단어에 a가 포함되어 있지 않으면 /문자열 집합 중 하나여야 합니다. 포함되어 있는 경우 /디렉터리여야 합니다.

이것:

_foo() {
    _arguments -C '1:Name:(Name1 Name2 Name3)' '1:Directory:_path_files -/'
}

동일한 매개변수를 두 번 지정할 수 없으므로 작동하지 않습니다. 나는 그것을 가지고 놀았 _regex_arguments지만 의미있는 행동을 얻지 못해서 뭔가 빠진 것 같습니다.

답변1

나는 결국 :

#compdef foo

_foo() {
     local curcontext="$curcontext" state line
     typeset -A opt_args
     _arguments -C '-a' '-b' '-c' '-d' '1: :->name'
     case $state in
         name)
             case $words[2] in
                 */*)
                     _arguments '*:directory:_path_files -/'
                     ;;
                 *)
                     _arguments '*:name:(Name1 Name2 Name3)'
                     ;;
             esac
     esac
}

_foo "$@"

그러나 이것이 최선의 해결책인지는 확실하지 않습니다. 특히 일부 예제의 사용법을 복사했지만 $words문서에서는 찾지 못했습니다.

관련 정보