다음이 필요한 사용자 정의 스크립트가 있습니다.
- 짧은/긴 형식에 대한 선택적 매개변수
- 필수 명령줄 인수
다음과 같은 짧은/긴 명령줄 옵션:
-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
.
먼저 실제 기능을 설정해 보겠습니다.
myfunc
.notes라는 파일 에 함수를 배치합니다 ..zsh
이것은 또는 으로 끝나지 않습니다.sh
.- 함수를 자체 파일에 넣을 때 상용구를 추가할 필요가 없습니다
funcname() {…}
.
- 파일이 포함된 디렉터리가
myfunc
에 있는지 확인하세요$fpath
. 예를 들어, 파일이myfunc
있는 경우 파일~/Functions
에 다음을 추가하세요~/.zshrc
.fpath+=( ~/Functions )
- 마지막으로
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
이제 명령줄에서 사용할 수 있습니다 (아직 아무것도 수행되지 않았습니다).
다음으로 완성 함수를 만들어 보겠습니다.
- 이라는 파일을 만듭니다
_myfunc
. - 이 파일을 넣으세요:
#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
호출하려는 매개변수로 바꾸세요 .- 옵션에 대한 설명을 입력합니다.
- 다시 한번, 파일이 있는 디렉토리가
$fpath
. - 이 작업을
autoload -Uz compinit; compinit
수행 하고 실행되는지 확인하십시오 ..zshrc
뒤쪽에위 디렉토리가 에 추가되었습니다$fpath
. - 셸을 다시 시작
exec zsh
하거나 터미널 창을 닫고 새 창을 엽니다.
이제 완료할 수 있을 것입니다 myfunc
.
readonly
및가 상호 배타적 이라면 mount
다음과 같이 완성 함수의 마지막 줄을 다시 작성해야 합니다.
_arguments \
(-m --mount){-r,--readonly}'[description for "readonly"]' \
(-r --readonly){-m,--mount}'[description for "mount"]' \
"*:required argument:( ${required//[()]/} )"