Comment définir les règles d'autocomplétion Zsh pour le second argument (de la fonction) aux règles d'une command existante?

J'ai une fonction Zsh personnalisée g :

 function g() { # Handle arguments [...] } 

En son sein, je gère des arguments courts qui exécutent des commands Git. Par exemple:

 g ls # Executes git ls-files ... gg # Executes git grep ... 

Je dois être capable de définir les règles d'auto-complétion dans les règles de Git pour les arguments courts, mais je ne suis pas sûr de savoir comment faire.

Par exemple, j'ai besoin de g ls <TAB> les règles pour les git ls-files <TAB> ce qui me donnerait les arguments pour git ls-files :

 $ g ls --<TAB> --abbrev -- set minimum SHA1 display-length --cached -- show cached files in output --deleted -- show deleted files in output # Etc... 

Cela ne consiste pas simplement à définir g pour l'autocomplétion pour git puisque je mappe mes commands courtes personnalisées aux commands Git.

J'ai trouvé /usr/share/zsh/functions/Completion/Unix/_git qui avait quelques conseils pour les alias comme celui-ci et a fini par définir ces fonctions pour les alias:

 _git-ls () { # Just return the _git-ls-files autocomplete function _git-ls-files } 

Ensuite, j'ai fait une compdef g=git droite compdef g=git . Le système de saisie semi-automatique verra que vous exécutez, par exemple, g ls et utilisez la fonction d' _git-ls .

Merci à user67060 de me diriger dans la bonne direction.

C'est ce que je ferais:

 _tg () { local _ret=1 local cur cword prev cur=${words[CURRENT]} prev=${words[CURRENT-1]} cmd=${words[2]} let cword=CURRENT-1 case "$cmd" in ls) emulate ksh -c _git_ls_files ;; g) emulate ksh -c _git_grep ;; esac let _ret && _default && _ret=0 return _ret } compdef _tg tg 

Cependant, ceci utilise la complétion de Git, pas la complétion de zsh:

https://git.kernel.org/cgit/git/git.git/tree/consortingb/completion/git-completion.zsh

Je devais faire quelque chose de très similaire donc c'est à peu près ce qui devrait résoudre votre problème.

 _g () { case "${words[2]}" in ls) words[1,2]=(git ls-files);; g) words[1,2]=(git grep);; *) return 1;; esac _git # Delegate to completion } compdef _g g 

Une chose à noter est que si vous changez le nombre d'arguments, vous devrez ajuster la variable $CURRENT .