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を使用すると、システム全体に関する詳細情報を見つけることができますが、多少密度が高くなります。