J’ai un script de complétion d’onglet Bash pour Hadoop d’Apache. Normalement, j’utilise zsh comme shell quotidien. Il a tendance à ressembler beaucoup à ce que je veux, mais il semblerait que les systèmes d’achèvement de tabulation diffèrent radicalement entre eux. Existe-t-il un moyen simple de «convertir» les définitions d’achèvement de bash-tab existantes en zsh? Je ne veux pas investir beaucoup de temps là-dedans, mais si c’est facile, je vais économiser un peu d’effort.
De cette page (datée du 2010/01/05):
Zsh peut gérer les fonctions de complétion de bash. La dernière version de développement de zsh a une fonction bashcompinit qui, lorsqu’elle est exécutée, 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 suffit de lancer bashcompinit à tout moment après Compinit. Il définira des fonctions complètes et compgen correspondant aux bases intégrées.
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
zsh 5.0.2 (x86_64-apple-darwin13.0)
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 nouvellement créé.
Merci au script git-completion.bash pour le conseil: D
Bash a un excellent support pour la complétion automatique mais les scripts d’autocomplétion bash ne fonctionnent pas directement car l’environnement zsh n’a pas les fonctions essentielles d’auto-complétion bash comme compgen
, complete
. Il le fait dans un effort pour maintenir la session zsh rapidement.
Ces jours-ci, zsh est livré avec des scripts d’achèvement appropriés, tels que compinit
et bashcompinit
qui ont les fonctions requirejses pour prendre en charge les scripts d’autocomplétion bash.
autoload
: Notez que l’autoload est défini dans zsh et non bash. autoload
recherche un fichier nommé dans les répertoires renvoyés par la commande fpath
et marque une fonction à charger lors de son premier appel.
Par exemple, sur mon système, echo $fpath
retourne /usr/share/zsh/site-functions
et /usr/share/zsh/5.0.5/functions
et compinit
et bashcompinit
sont tous deux disponibles dans /usr/share/zsh/5.0.5/functions
Aussi, pour la plupart des gens, seul l’ autoload -U +X bashcompinit && bashcompinit
est nécessaire car un autre script comme git autocomplete ou leur propre ~/.zshrc
peut-être autoload -U +X compinit && compinit
, mais vous autoload -U +X compinit && compinit
simplement exécuter les deux d’eux.
Pour zsh
utiliser:
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
Je cours Antigen en tant que gestionnaire de plug-in Oh-My-Zsh. J’ai eu quelques scripts d’achèvement de 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 du chargement des scripts de fin de leurs plugins. J’ai finalement contourné ce bashcompinit
automatiquement bashcompinit
et compinit
après antigen apply
. Le simple chargement automatique de bashcompinit
ne suffisait pas.
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 fichier .zcompdump
à $ANTIGEN_COMPDUMP
qui pour moi était ~/.antigen/.zcompdump
La nouvelle invocation de compinit et bashcompinit crée un second fichier .zcompdump à $HOME/.zcompdump
Cela semble fonctionner, car je suis capable d’utiliser les compléments définis 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.
Après avoir redémarré la machine, j’ai dû réutiliser les fichiers .zcompdump à plusieurs resockets en raison d’erreurs générées lors de la tentative de tabulation, mais je ne suis pas sûr que cela soit dû à cette configuration ou autre. 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