web-dev-qa-db-fra.com

Un script de complétion de tabulation Bash peut-il être utilisé dans zsh?

J'ai un script de fin de tabulation Bash pour Hadoop d'Apache. Normalement, j'utilise zsh comme mon shell au jour le jour. Cela a tendance à être assez bash quand j'en ai besoin, mais il semble que les systèmes de tabulation soient radicalement différents entre eux. Existe-t-il un moyen simple de "convertir" les définitions de bash-tab-complétion existantes pour qu'elles fonctionnent dans zsh? Je ne veux pas investir une tonne de temps dans cela, mais si c'est facile, j'économiserais un effort modéré.

74
Coderer

De cette page (du 2010/01/05):

Zsh peut gérer les fonctions d'achèvement de bash. La dernière version de développement de zsh a une fonction bashcompinit qui, lors de son exécution, permettra à zsh de lire les spécifications et les fonctions d'achèvement de bash. Ceci est documenté dans la page de manuel zshcompsys. Pour l'utiliser, il vous suffit d'exécuter bashcompinit à tout moment après compinit. Il définira les fonctions complètes et compgen correspondant aux commandes internes bash.

34
Dennis Williamson
autoload bashcompinit
bashcompinit
source /path/to/your/bash_completion_file
139
freestyler
autoload -U +X compinit && compinit
autoload -U +X bashcompinit && bashcompinit
source /path/to/your/bash_completion_script

J'exécute zsh zsh 5.0.2 (x86_64-Apple-darwin13.0)sans aucun ~/.zshrc et la séquence ci-dessus a fonctionné dans un shell zsh fraîchement généré.

Merci au script git-complétement.bash pour l'indice: D


Lisez la suite pour plus de détails sur les 3 lignes ci-dessus:

Bash a un support de complétion automatique génial mais les scripts bash de saisie semi-automatique ne fonctionnent pas directement zsh car l'environnement zsh n'a pas les fonctions d'aide bash de saisie semi-automatique essentielles comme compgen, complete. Il le fait dans le but de maintenir la session zsh rapide.

De nos jours, zsh est livré avec des scripts de complétion appropriés comme compinit et bashcompinit qui ont les fonctions requises pour prendre en charge les scripts de saisie semi-automatique bash.

autoload <func_name>: Notez que le chargement automatique est défini dans zsh et non bash. autoload recherche un fichier nommé dans les chemins de répertoire renvoyés par la commande fpath et marque une fonction pour la charger lors de son premier appel.

  • - U: Ignorer tous les alias lors du chargement d'une fonction comme compinit ou bashcompinit
  • + X: Il suffit de charger la fonction nommée maintenant et de ne pas l'exécuter

Par exemple, sur mon système, echo $fpath Renvoie /usr/share/zsh/site-functions Et /usr/share/zsh/5.0.5/functions Et les deux compinit et bashcompinit sont disponibles sur /usr/share/zsh/5.0.5/functions.

De plus, pour la plupart des gens, seul autoload -U +X bashcompinit && bashcompinit Est requis car un autre script comme git autocomplete ou leur propre ~/.zshrc Peut faire autoload -U +X compinit && compinit, Mais il est sûr de simplement exécuter les deux .

31
Jatin Kumar

Pour zsh utilisez:

  • compdef
  • compadd

Mon exemple:

# bash completion for bxrun (/home/ecuomo/projects/bashx/bxrun)
_bxrun_methods() {
    grep "^\s*\(function\s\+\)\?__.\+()\s*{.*$" "${1}" | while read line ; do
        echo "$line" | sed "s/()\s*{.*//g" | sed "s/\s*\(function\s\+\)\?__//g"
    done
}
_bxrun_lst() {
    if [ -d "/home/ecuomo/projects/bashx/src/actions" ]; then
        for f in /home/ecuomo/projects/bashx/src/actions/* ; do
            if [ -f "${f}" ]; then
                basename "${f}" | sed 's/\..*$//g'
            fi
        done
    fi
    _bxrun_methods "/home/ecuomo/projects/bashx/bxrun"
    _bxrun_methods "/home/ecuomo/projects/bashx/src/bashx.sh"
}
_bxrun() {
    local cur
    COMPREPLY=()
    cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $( compgen -W '$( _bxrun_lst )' -- $cur  ) )
}
_bxrun_zsh() {
    compadd `_bxrun_lst`
}
if type complete >/dev/null 2>/dev/null; then
    # bash
    complete -F _bxrun bxrun
else if type compdef >/dev/null 2>/dev/null; then
    # zsh
    compdef _bxrun_zsh bxrun
fi; fi

Source: Mon code https://github.com/reduardo7/bashx

2
Eduardo Cuomo

J'utilise Antigen en tant que gestionnaire de plugins Oh-My-Zsh. J'ai eu quelques scripts de complétion bash écrits par des collègues que je voulais charger dans Zsh avec un simple source /path/to/completion.

J'ai eu quelques problèmes, car il semble que Antigen ou OMZ (difficile à dire) ne se préoccupent que de charger les scripts d'achèvement à partir de leurs plugins. J'ai finalement réussi à contourner ce problème en chargeant automatiquement bashcompinit et compinit après antigen apply. Le simple chargement automatique bashcompinit n'était pas suffisant.

source ~/.antigen/antigen.zsh
antigen use oh-my-zsh
antigen apply

autoload -U +X compinit && compinit
autoload -U +X bashcompinit && bashcompinit

source /path/to/bash_completion

Antigen crée son .zcompdump fichier à $ANTIGEN_COMPDUMP qui pour moi était ~/.antigen/.zcompdump

La nouvelle invocation de compinit et bashcompinit crée un deuxième .zcompdump à $HOME/.zcompdump

Cela semble pour tout fonctionner, car je suis en mesure d'utiliser les compléments mis en place par /path/to/bash_completion. J'ai supprimé les deux fichiers .zcompdump plusieurs fois pour m'assurer qu'ils sont régénérés et semblent fonctionner.

J'ai dû rm les fichiers .zcompdump plusieurs fois après un redémarrage de la machine en raison d'erreurs levées lors de la tentative de tabulation terminée, mais je ne suis pas sûr si cela est dû à cette configuration ou à autre chose. rm ~/.zcompdump && rm $ANTIGEN_COMPDUMP et un nouveau Shell corrige cela pour moi.

Versions utilisées au moment de la rédaction:

Antigen = v2.2.3 = d3d4ee0
Oh-my-zsh = c3b072e
Zsh = 5.3
2
Walter Wilfinger