래퍼 명령에 대한 zsh 완료 함수를 작성하는 방법

래퍼 명령에 대한 zsh 완료 함수를 작성하는 방법

myssh라는 SSH용 사용자 정의 래퍼에 대한 완료 함수를 작성하려고 합니다. myssh는 다음 형식 중 하나로 명령줄 인수를 사용합니다.

myssh [myssh options] [ssh args]

또는

myssh [myssh options] -- [ssh options] [ssh args]

SSH에 대한 기존 완성 기능을 재사용하면서 myssh 특정 옵션에 대한 완성 기능을 제공하려면 어떻게 해야 합니까?

_gnu_generic편집: 나는 또한 이 기능을 사용하고 싶습니다여기서 언급한myssh 옵션을 완료하는 데 사용됩니다.

답변1

보다 일반적인 경우 @Franklin\ Yu의 의견은 귀하의 요구에 충분하지 않으며 그에 따라 완성 명령을 공식화할 수 있습니다. 명령을 예로 들어 보겠습니다 flux. 이 명령과 유사한 많은 명령은 다소 까다로우며 명령을 완성하는 첫 번째 인수가 원래 명령의 이름이 될 것으로 예상하므로 실패합니다.

$ compdef myflux=flux
$ myflux<tab>
l2advertisement.yaml  pool.yaml # <--- not expected

myflux변수의 첫 번째 명령을 바꾸는 도우미 명령을 도입하면 $words이 문제가 해결됩니다.

_myflux() {
  words="flux ${words[@]:1}"     # replace myflux with flux, in `words` array
  _flux                           # call original completion command which expects a words array beginning with `flux`
}

$ compdef _myflux myflux

$ myflux<tab> 
bootstrap   -- Deploy Flux on a cluster the GitOps way.
build       -- Build a flux resource
check ...
...
# the above *is* expected.

때로는 원래 명령을 다음과 같은 하위 명령으로 래핑합니다.flux get source

배열의 변경된 행은 $words다음과 같습니다.

  words="flux get source ${words[@]:1}"

관련 정보