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é.
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.
autoload bashcompinit
bashcompinit
source /path/to/your/bash_completion_file
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
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.
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 .
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
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