저는 zsh에 대한 사용자 정의 경주 함수를 작성 중입니다. 현재 다음 코드가 있습니다
_arguments \
...
'(-G --glitchpct)'{-G+,--glitchpct=}'[Controls how often the characters on screen glitch]'
나는 현재 또는 -G VALUE
둘 중 하나 glitchpct=VALUE
를--glitchpct VALUE
허용한다고 지정합니다(동일한 그룹에 속하므로 상호 배타적임).
매개변수 값이 1개가 아닌 2개가 필요한 경우 어떻게 해야 하나요? 즉, -G VALUE1 VALUE2
또는 가 있을 것으로 예상합니다 --glitchpct=VALUE1,VALUE2
. 이것을 어떻게 지정하나요? 또한 3개의 동일한 매개변수가 있는 경우 차이점은 무엇입니까?
또한 각 매개변수에 대한 사용자 정의 메시지를 표시할 수 있습니까? VALUE1
표시되어야 'float from 0 to 50'
하며 화면에 VALUE2
표시되어야 한다고 말합니다 . 내장을 통해 이 작업을 수행 'float from 100 to 150'
할 수 있다고 생각 하지만 어떻게 작동하게 만드는지 잘 모르겠습니다. _message
다음과 같이 상태를 지정해 보았습니다. (아직 두 개의 값을 사용하는 방법을 파악하지 못했기 때문에 이는 하나의 값에서만 작동합니다.)
_arguments \
...
'(-G --glitchpct)'{-G+,--glitchpct=}'[Controls how often the characters on screen glitch]:float:->display_float'
...
case "$state" in
(display_float)
_message "sample message"
;;
esac
그러나 이것은 아무것도 보여주지 않습니다. 다음 형식도 작동하지 않습니다.
'(-G --glitchpct)'{-G+,--glitchpct=}'[Controls how often the characters on screen glitch]:float:_message "sample message"
답변1
매개변수 배열을 포함하는 예제로 연결되기를 바라면서 위의 설명을 제공합니다. 다음은 링크에서 직접 복사한 예입니다.
_arguments '-m[music file]:filename:->files' '-f[flags]:flag:->flags'
case "$state" in
files)
local -a music_files
music_files=( Music/**/*.{mp3,wav,flac,ogg} )
_multi_parts / music_files
;;
flags)
_values -s , 'flags' a b c d e
;;
esac
위의 예는 Howto에서 가져온 것이며 매개변수를 배열로 전달하는 방법을 보여줍니다. 이 예를 분석하면 다음과 같습니다.
- 그 진술은
-m
다음과 같을 수도 있습니다-ma
.a
모든 음악 파일 목록이 포함되며 파일 이름은 필요하지 않습니다. - 이
flags
섹션은 구체화되지는 않았지만 다음의 가능한 값-f
으로 초기화를 허용합니다.-fs
-fa
-fe
코드 관련: 위의 코드와 유사한 다음 형식을 고려하세요.
_arguments '-G[glitchpercentage]:gpercent:->percents' '-f[flags]:flag:->flags'
case "$state" in
percents)
local -a percents
glitchpercentage=\\do something to set to 100%
_message "Some message for all option"
local -h percents
glitchpercentage=//do something to set to 50%
_message "Some message for half option"
;;
flags)
// Add these to control the program, i.e. use these options
// if they dont control something in the percents array.
_values -s , 'flags' a b c d e
;;
esac
위의 내용은 테스트되지 않았으므로 의사 코드로 간주하십시오. 위와 같이 배열을 사용하려고한다고 생각합니다.