Comment définir des règles d'auto-complétion Zsh pour le second argument (de la fonction) sur les règles d'une commande existante?

9

J'ai une fonction Zsh personnaliséeg :

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

À l'intérieur, je gère de courts arguments qui exécutent des commandes Git. Par exemple:

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

J'ai besoin de pouvoir définir les règles de saisie semi-automatique sur les règles de Git pour les arguments courts, mais je ne sais pas comment procéder.

Par exemple, je dois g ls <TAB>compléter par tabulation les règles pour git ls-files <TAB>lesquelles me donneraient 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...

Il ne s'agit pas simplement gde la saisie semi-automatique gitcar je mappe mes commandes courtes personnalisées aux commandes Git.

Erik Nomitch
la source
1
Si votre fonction mappe uniquement des noms plus courts aux sous-commandes git, vous pouvez également utiliser le système d'alias git pour cela. Lisez à ce sujet dans le mapage: man git-config.
Lucas

Réponses:

3

J'ai trouvé /usr/share/zsh/functions/Completion/Unix/_gitqui avait quelques conseils pour des alias comme celui-ci et j'ai 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 quinte compdef g=git. Le système de saisie semi-automatique verra que vous exécutez, par exemple, g lset utilisera la _git-lsfonction de saisie semi - automatique.

Merci à user67060 de m'avoir orienté dans la bonne direction.

Erik Nomitch
la source
2

J'ai dû faire quelque chose de très similaire, c'est donc à 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 modifiez le nombre d'arguments, vous devrez ajuster la $CURRENTvariable.

Kevin Cox
la source
1

Voici 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, cela utilise l'achèvement de Git, pas l'achèvement de zsh:

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

FelipeC
la source
Merci, j'ai fini par emprunter une voie différente car je ne savais pas où trouver les règles d'achèvement de Git et j'obtenais des erreurs. Voir ma réponse.
Erik Nomitch