ラッパーコマンドの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}"

関連情報