난수를 허용하는 zsh용 자동 완성 기능을 만드는 방법은 무엇입니까?

난수를 허용하는 zsh용 자동 완성 기능을 만드는 방법은 무엇입니까?

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

관련 정보