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

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


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

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.

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

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