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.


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.


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.


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.