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

関連情報