2017-09-20 13 views
1

다른 플래그의 값에 따라 내 완료 중 하나가 동적으로 생성되는 완료를 작성하려고합니다. 예 :ZSH 이전 플래그에 기초한 완료

local state 

_arguments \ 
    '-f[fabric]:fabric:->fabrics' \ 
    '-c[containers/application where log resides]:container:->containers' \ 
    '-l[name of log file]:log:->logs' 

case "$state" in 
    (fabrics) 
     _values 'fabrics' \ 
      'fab1' \ 
      'fab2' 
    ;; 
(containers) 
    _values 'containers' \ 
     'container1' \ 
     'container2' 
    ;; 
(logs) 
    # show A B C if "-c container1" was entered 
    # show D E F if "-c container2" was entered 
    # show G if "-c" was not provided yet 
esac 

"-l"플래그를 동적으로 생성하는 데 문제가 있습니다.

답변

1

우리는 $words 검사 수 :

완료 특수 파라미터
... 완료 위젯 내부
, 그들에서 호출 어떤 기능을 일부 매개 변수는 특별한 의미를 가지고;
...
words
이 배열에는 현재 편집중인 명령 줄에있는 단어가 들어 있습니다.

- zshcompwid(1): Completion Special Parameters, Completion Widgets

우리는 같은 물건을 할 수있는 :

:

(logs) 
    local -i index=${words[(I)-c]} 
    local -i ret=0 
    if ((index == 0)); then 
     _values 'logs' F 
     ret=$? 
    elif [[ "$words[index+1]" == container1 ]]; then 
     _values 'logs' A B C 
     ret=$? 
    elif [[ "$words[index+1]" == container2 ]]; then 
     _values 'logs' D E F 
     ret=$? 
    fi 
    return ret 

가 배열을 검사하기 위해서는 배열 Subscript Flags을 사용하는 것이 유용합니다 아래 첨자 플래그
여는 첨자에서 여는 괄호 또는 범위의 쉼표 뒤에 여는 괄호가있는 경우 일치하는 닫는 괄호까지의 문자열은 name[(flags)exp]과 같이 플래그 목록으로 간주됩니다.

-zshparam(1), Subscript Flags, Array Subscripts, Array Parameters

그래서, $words[(I)-c]I은 "플래그" "어레이에 $word"-c "에 대한 최종 매칭 소자 색인"이다 $words위한 "EXP"+ -c 등을 의미한다. 예 :

$ tmp=(my-test-command -f flag -c container1 -l) 
$ echo $tmp[(I)-c] 
4 
$ echo $tmp[(I)container1] 
5 
$ tmp=(my-test-command -f flag -c container1 -c container2 -l) 
$ echo $tmp[(I)-c] 
6 
+0

나는 그것을 작동 시키지만, 나는 첫 번째 색인 부분을 이해하지 못한다. (I)과 -c가 무엇인지 설명해 주시겠습니까? – peter1234

+1

업데이트 됨; 아래 예제 플래그를 사용하여 배열을 검사하는 예제/사용법을 추가했습니다. – hchbaw