임의의 숫자를 허용할 수 있는 zsh의 자동 완성 기능을 어떻게 만들 수 있나요?

임의의 숫자를 허용할 수 있는 zsh의 자동 완성 기능을 어떻게 만들 수 있나요?

gitlab repos에서 티켓을 관리하기 위한 작은 스크립트가 있습니다. 티켓을 입력하고 탭을 누르면 다음을 확인하고 싶습니다.

% 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자동 로드 가능으로 표시되도록 합니다.

관련 정보