래퍼 명령에 대한 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}"

관련 정보