20

Mercurial、Git、Subversion などによく似たサブコマンドを使用するコマンドライン ツールを作成しました。その一般的な使用法は次のとおりです。

>myapp [OPTS] SUBCOMMAND [SUBCOMMAND-OPTS] [ARGS]

例えば

>myapp --verbose speak --voice=samantha --quickly "hello there"

私は現在、そのための Zsh 補完を構築している最中ですが、それが非常に複雑な獣であることがすぐにわかりました。_hgとの補完を見てきました_gitが、それらは非常に複雑でアプローチが異なります (理解するのに苦労しています) が、どちらも各サブコマンドを個別に処理しているようです。

_arguments組み込み関数 ( 、_valuespick_variant&c.) を使用して、一般的なオプションとサブコマンド固有のオプションを適切に処理するなど、サブコマンドの概念を正しく処理する方法があるかどうかは誰にもわかりませんか? または、一般的なオプションとサブコマンドを手動で処理するのが最善の方法でしょうか?

うなずく例は非常に高く評価されます。

どうもありがとう。

4

1 に答える 1

27

zshの完了スクリプトを作成するのは非常に難しい場合があります。最善の策は、既存のものをガイドとして使用することです。git用のものは初心者のimoには多すぎます。このリポジトリを使用できます:

https://github.com/zsh-users/zsh-completions

あなたの質問に関しては、あなたは状態の概念を使用しています。リストでサブコマンドを定義し、$ stateを介して、どのコマンドを使用しているかを識別します。次に、各コマンドのオプションを定義します。これは、 playの完了スクリプトで確認できます。簡略化されたバージョンは以下のとおりです。

_play() {
  local ret=1

  _arguments -C \
    '1: :_play_cmds' \
    '*::arg:->args' \
  && ret=0

  case $state in
    (args)
       case $line[1] in
         (build-module|list-modules|lm|check|id)
           _message 'no more arguments' && ret=0
         ;;
         (dependencies|deps)
           _arguments \
             '1:: :_play_apps' \
             '(--debug)--debug[Debug mode (even more informations logged than in verbose mode)]' \
             '(--jpda)--jpda[Listen for JPDA connection. The process will  suspended until a client is plugged to the JPDA port.]' \
             '(--sync)--sync[Keep lib/ and modules/ directory synced. Delete unknow dependencies.]' \
             '(--verbose)--verbose[Verbose Mode]' \
             && ret=0
         ;;
       esac
   esac

(これを貼り付ける場合は、元のソースを使用してください。これは機能しません)。

気が遠くなるように見えますが、一般的な考え方はそれほど複雑ではありません。サブコマンドが最初に来て(_play_cmdsは、それぞれの説明を含むサブコマンドのリストです)、次に引数が来ます。引数は、選択しているサブコマンドに基づいて作成されます。引数を共有する場合は、複数のサブコマンドをグループ化できることに注意してください。

man zshcompsysを使用すると、システム全体に関する詳細情報を見つけることができますが、多少密度が高くなります。

于 2012-01-25T10:15:27.540 に答える