고쳐 쓰다:

고쳐 쓰다:

사용자 정의 스크립트에 대한 zsh 완성 파일이 있습니다 foo.

다음 위치에서 일반 파일을 완료해야 합니다 $HOME/foo.

#compdef foo

_arguments -S : \
    '-i' \
    '1:thing:_path_files -W $HOME/foo -g "*(.)"'

수정해야 할 내용은 다음과 같습니다.

선택적 매개변수를 추가합니다 --dir.

를 입력하면 foo --dir<TAB>디렉토리에 대한 완성 기능이 제공되어야 합니다.$HOME/foo

foo --dir=<TAB>

또한 파일 완료 경로( $HOME/foo기본값)를 로 변경해야 합니다 $HOME/foo/my_dir. 여기서 my_dir제공된 이름은 입니다 --dir=my_dir.

고쳐 쓰다:

기본적으로 완성 규칙에는 두 가지 작동 모드가 있어야 합니다.

  1. 를 입력하면 foo -<TAB>선택적 매개변수( )가 제공되어야 합니다 -d -w -l -i. 그런 다음 선택한 선택적 매개변수에 따라 다음을 수행합니다.

1a) foo -d <TAB>경로의 완전한 디렉토리만

1b) foo -w / -l / -i <TAB>경로의 일반 파일 완성

이것은 예상대로 작동합니다.

  1. 를 입력하면 foo <TAB>완성 규칙이 경로에 일반 파일을 제공해야 합니다. 현재 예상대로 작동하지 않습니다. 여전히 선택적 매개변수가 제공되므로 디렉토리/파일을 완료하기 전에 하나를 선택해야 합니다.

foo <TAB>( 없이 ) 입력하면 -옵션 매개변수만 제공됩니다. 내 완성 규칙은 선택적 매개 변수 중 하나를 선택한 경우에만 경로에 디렉터리/파일을 제공합니다.

선택적 인수 없이 작동하고 이 경우 경로의 일반 파일만 완성하도록 스크립트를 수정하려면 어떻게 해야 합니까?

완성 규칙은 다음과 같습니다.

#compdef foo

local -A opt_args

_arguments -S -C \
    '-i[select file]:thing_file:_path_files -W $HOME/manuals/${opt_args[-d]} -g "*(.)"' \
    '-l[select file]:thing_file:_path_files -W $HOME/manuals/${opt_args[-d]} -g "*(.)"' \
    '-w[select file]:thing_file:_path_files -W $HOME/manuals/${opt_args[-d]} -g "*(.)"' \
    '-d[select directory]:directory_file:_path_files -/ -W $HOME/manuals' \
     && return 0

마지막으로 작은 질문이 하나 있습니다. 완료 규칙에서는 하나의 선택적 매개변수만 예상(완료)합니다.

입력할 때 foo -i -<TAB>나머지 선택적 매개변수는 제공되지 않습니다. 이러한 매개변수는 상호 배타적이어서는 안 됩니다. 다음을 사용하여 작동해야 합니다.

foo -i -l -w <TAB>

답변1

그렇게:

#compdef foo

local -A opt_args

_arguments -S -C \
    '-i[select file]:thing_file:_path_files -W $HOME/foo/${opt_args[-d]} -g "*(.)"' \
    '-d[select directory]:directory_file:_path_files -/ -W $HOME/foo' \
     && return 0

해당 기능이 어떻게 작동하는지 설명하세요.

~/foo 생성:

mkdir ~/foo

~/foo에 10개의 디렉터리를 만듭니다.

mkdir ~/foo/DIR{1..10}

4번 디렉토리에 파일을 생성합니다:

$ touch ~/foo/DIR4/FILE4

그리고 ~/foo에 있는 파일:

touch ~/foo/FILE-IN-FOO

유형

음식

그리고 를 누르세요 Tab. 보여주다:

$foo -d DIR1/
DIR1/   DIR10/  DIR2/   DIR3/   DIR4/   DIR5/   DIR6/   DIR7/   DIR8/   DIR9/

디렉토리만 표시되므로 FILE-IN-FOO는 없습니다.

DIR4를 선택하고 -i를 추가합니다.

foo -d DIR4 -i

그리고 를 누르세요 Tab. 보여주다:

foo -d DIR4 -i FILE4

관련 정보