Question

J'ai écrit un outil de ligne de commande qui utilise des sous-communs un peu comme Mercurial, Git, Subversion & c., En ce que son utilisation générale est:

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

Par exemple

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

Je suis maintenant en train de construire l'achèvement ZSH pour cela, mais j'ai rapidement découvert qu'il s'agit d'une bête très complexe. J'ai jeté un coup d'œil au _hg et _git Complétion mais ils sont très complexes et différents dans l'approche (j'ai du mal à les comprendre), mais les deux semblent gérer chaque sous-commanda séparément.

Quelqu'un sait-il s'il y a un moyen d'utiliser les fonctions intégrées (_arguments, _values, pick_variant & C Ou la meilleure approche serait-elle de gérer manuellement les options générales et les sous-commands?

Un exemple de noddy serait très apprécié.

Merci beaucoup.

Était-ce utile?

La solution

Vous avez raison dans la mesure où la rédaction de scripts pour ZSH peut être assez difficile. Votre meilleur pari est d'utiliser un guide existant comme guide. Celui pour Git est beaucoup trop pour un débutant, OMI. Vous pouvez utiliser ce repo:

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

Quant à votre question, vous avez utilisé le concept de Etat. Vous définissez vos sous-commandes dans une liste, puis vous identifiez via $ État Dans quelle commande vous êtes. Ensuite, vous définissez les options pour chaque commande. Vous pouvez le voir dans le script d'achèvement pour jouer. Une version simplifiée est ci-dessous:

_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

(Si vous allez coller cela, utilisez la source d'origine, car cela ne fonctionnera pas).

Cela semble intimidant, mais l'idée générale n'est pas si compliquée. La sous-commande vient en premier (_Play_CMDS est une liste de sous-commandes avec une description pour chacune), puis venez les arguments. Les arguments sont construits en fonction de la sous-commande que vous choisissez. Notez que vous pouvez regrouper plusieurs sous-commandes, s'ils partagent des arguments.

avec homme zshcompsys Vous pouvez trouver plus d'informations sur l'ensemble du système, bien qu'il soit un peu dense.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top