고쳐 쓰다:

고쳐 쓰다:

다음이 필요한 사용자 정의 스크립트가 있습니다.

  1. 짧은/긴 형식에 대한 선택적 매개변수
  2. 필수 명령줄 인수

다음과 같은 짧은/긴 명령줄 옵션:

-r, --readonly
-m, --mount

필수 매개변수의 경우 매개변수는 실제로 스크립트에서 Case 문으로 지정됩니다. 즉, 이 예 foo에서는 다음과 같습니다.bar

case $1 in
  foo )
  :
  ;;

  bar )
  :
  ;;

zsh completion매개변수가 다음으로 시작될 때 선택적 매개변수가 완료되도록 스크립트를 생성 -하고 스크립트 사례 설명에서 필수 매개변수를 가져오려면 어떻게 해야 합니까 ?

고쳐 쓰다:

답변에서 영감을 받아 지금까지 얻은 내용은 다음과 같습니다 @Marlon Richert.

myscript.sh내 사용자 정의 스크립트가 호출 되고 내가 만든 완료 규칙이 다음 위치에 있다고 가정해 보겠습니다 /usr/share/zsh/functions/Completion/Unix/_myscript.sh.

#compdef myscript.sh

_myscript () {
  local -a args

  args+=(
    {-r,--readonly}'[description for "readonly"]' 
    {-m,--mount}'[description for "mount"]' 
  )

  _arguments $args && return
}

_myscript "$@"

내 스크립트 myscript.sh자체는 /usr/local/bin/myscript.sh.

이제 선택적 매개변수가 있고 이를 처리할 때 -r스크립트 에 필요한 명령줄 매개변수에 대해 Case 문의 항목이 완성으로 제공 -m되도록 완성 규칙을 수정해야 합니다 ./usr/local/bin/myscript.sh

args+=(또한 스크립트의 6행에서 시작하는 블록을 완성하는 구문이 올바른지 잘 모르겠습니다 . 작은따옴표는 어디에 넣어야 하나요?

답변1

완성을 정의하려는 함수가 호출된다고 가정합니다 myfunc.

먼저 실제 기능을 설정해 보겠습니다.

  1. myfunc.notes라는 파일 에 함수를 배치합니다 .
    • .zsh이것은 또는 으로 끝나지 않습니다 .sh.
    • 함수를 자체 파일에 넣을 때 상용구를 추가할 필요가 없습니다 funcname() {…}.
  2. 파일이 포함된 디렉터리가 myfunc에 있는지 확인하세요 $fpath. 예를 들어, 파일이 myfunc있는 경우 파일 ~/Functions에 다음을 추가하세요 ~/.zshrc.
    fpath+=( ~/Functions )
    
  3. 마지막으로 myfunc파일에 자동 로드합니다 ~/.zshrc.
    # We pass a couple of options that make the code 
    # less likely to break:
    # -U suppresses alias expansion
    # -z marks the function for zsh-style autoloading == 
    #    `unsetopt KSH_AUTOLOAD`
    autoload -Uz myfunc
    

myfunc이제 명령줄에서 사용할 수 있습니다 (아직 아무것도 수행되지 않았습니다).

다음으로 완성 함수를 만들어 보겠습니다.

  1. 이라는 파일을 만듭니다 _myfunc.
  2. 이 파일을 넣으세요:
    #compdef myfunc
    
    # The line above means "This function generates 
    # completions for myfunc."
    # The combination of that line, plus the file name
    # starting with an `_`, plus having this file's 
    # parent dir in your `$fpath`, ensures this file 
    # will be autoloaded when you call `compinit`.
    
    # `+X` makes sure `myfunc`'s definition will get 
    # loaded immediately, even if you have not called 
    # this function yet.
    autoload +X -Uz myfunc
    
    # Get the definition of `myfunc` in string form.
    local funcdef="$( type -f myfunc )"
    
    # Get the part that matches `case*esac`, then split
    # it on whitespace and put the resulting words in an 
    # array.
    local -a words=( ${=funcdef[(r)case,(r)esac]} )
    
    # Keep only the words that start with `(` and end 
    # with `)`.
    # Even if you used the `case` syntax with only the 
    # closing `)`s, `type -f` will show your cases with
    # both `(` and `)`.
    local -a required=( ${(M)words:#'('*')'} )
    
    # `-s`: Allow options to `myfunc ` to be stacked, 
    # that is, you are allowed to specify `myfunc -rm`.
    # If not, remove the `-s` option.
    # `*:`: Let this argument be completed in any 
    # position.
    _arguments -s \
        {-r,--readonly}'[description for "readonly"]' \
        {-m,--mount}'[description for "mount"]' \
        "*:required argument:( ${required//[()]/}  )"
    
    • required argument호출하려는 매개변수로 바꾸세요 .
    • 옵션에 대한 설명을 입력합니다.
  3. 다시 한번, 파일이 있는 디렉토리가 $fpath.
  4. 이 작업을 autoload -Uz compinit; compinit수행 하고 실행되는지 확인하십시오 ..zshrc뒤쪽에위 디렉토리가 에 추가되었습니다 $fpath.
  5. 셸을 다시 시작 exec zsh하거나 터미널 창을 닫고 새 창을 엽니다.

이제 완료할 수 있을 것입니다 myfunc.


readonly및가 상호 배타적 이라면 mount다음과 같이 완성 함수의 마지막 줄을 다시 작성해야 합니다.

_arguments \
    (-m --mount){-r,--readonly}'[description for "readonly"]' \
    (-r --readonly){-m,--mount}'[description for "mount"]' \
    "*:required argument:( ${required//[()]/}  )"

관련 정보