
gitlab 저장소에 티켓을 관리하기 위한 작은 스크립트가 있습니다. 티켓을 입력하고 Tab을 누르면 다음을 확인하고 싶습니다.
% ticket
new -- create a new ticket
# -- Number of ticket
-v -- increase verbosity
이를 위해 나는 작동하지 않는 다음을 수행했습니다.
#compdef ticket
#autoload
local -a reply
_regex_words commands "ticket commands" \
'new:create a new ticket' \
'-v:increase verbosity' \
'[1-9][0-9]#:open ticket #'
_regex_arguments _ticket /$'[^\0]##\0'/ "${reply[@]}"
_ticket "$@"
나는 그것이 내 머릿속에 있는 숫자를 완성할 수 없다는 것을 알고 있습니다. 또한 그것이 나가서 잠재적으로 수천 개의 숫자를 로드하는 것을 원하지도 않습니다. 하지만 숫자는 완성이 가능하다는 점을 참고하시면 좋을 것 같습니다.
답변1
이 기능은 패턴이 아닌 문자 그대로의 단어에 대해 작동합니다( 단어를 축약할 수 있는 단일 단어 _regex_words
제외 ). 따라서 다음과 같이 숫자를 직접 처리 *
해야 합니다 ._regex_arguments
#compdef ticket
local -a reply
_regex_words commands "ticket commands" \
'new:create a new ticket' \
'-v:increase verbosity'
_regex_arguments _ticket /$'[^\0]##\0'/ \
\( "${reply[@]}" \
\| $'/[1-9][0-9]#\0/' ': _message -e numbers "open ticket"' \)
_ticket "$@"
이건 좀 추악해야합니다 _message
. 이는 구현 방식의 부작용이지만 _alternative
다른 곳에서도 이 스타일의 예가 있습니다. 예를 들어 공통 옵션이 많은 경우 해당 옵션을 -v
사용하는 것이 가장 좋으며 더 복잡한 영역 _arguments
에만 사용됩니다 ._regex_arguments
그런데 #autoload
태그가 중복되었습니다. compinit
첫 번째 행만 보면 자동 로드 가능으로 표시됩니다 #autoload
.#compdef