J'ai un script de complétion de tabulation Bash pour Hadoop d'Apache. Normalement, j'utilise zsh comme shell au quotidien. Cela a tendance à être plutôt bash quand j'en ai besoin, mais il semble que les systèmes de complétion par onglets soient radicalement différents entre eux. Existe-t-il un moyen simple de "convertir" les définitions de complétion bash-tab-complétion existantes pour qu'elles fonctionnent dans zsh? Je ne veux pas y investir beaucoup de temps, mais si c'est facile, j'économiserais un effort modéré.
la source
/etc/zsh/zshrc
. En outre, vérifiez les fichiers suivants dans l' ordre inverse ( voir la liste dans l'ordre où ils sont achetés au démarrage zsh):/etc/zsh/zshenv
,$ZDOTDIR/.zshenv
,/etc/zsh/zprofile
et$ZDOTDIR/.zprofile
(probablement~/.zprofile
) pour voir si laRCS
variable est hors service. Si tel est le cas, cela empêcherait la source des fichiers suivants après le fichier dans lequel il est désactivé. Enfin, vérifiez le shell de l'utilisateur/etc/passwd
et assurez-vous qu'il estzsh
et assurez-vous qu'il n'a pas d'-f
argument.autoload bashcompinit bashcompinit source /path/to/your/bash_completion_file
la source
complete:13: command not found: compdef
erreur.if is-bash
coche en haut._get_comp_words_by_ref
qui ne sont pas définis parbashcompinit
. Cependant, la plupart des complétions n'utilisent pas cette fonction.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)
J'exécute zsh sans aucun ~ / .zshrc et la séquence ci-dessus a fonctionné dans un shell zsh fraîchement généré.Merci au script git-completion.bash pour l'indice: D
Lisez la suite pour plus de détails sur les 3 lignes ci-dessus:
Bash impressionnant à l' appui construit auto complétion , mais les scripts bash autocomplete ne zsh directement fonctionne pas comme environnement zsh ne pas les fonctions d'aide bash essentielle autocomplete aiment
compgen
,complete
. Il le fait dans un effort pour garder la session zsh rapide.Ces jours-ci, zsh est livré avec des scripts de complétion appropriés comme
compinit
etbashcompinit
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 dans bash.autoload
recherche un fichier nommé dans les chemins de répertoire renvoyés par lafpath
commande 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 deuxcompinit
etbashcompinit
sont disponibles sur/usr/share/zsh/5.0.5/functions
.De plus, pour la plupart des gens, ce n'est peut-être
autoload -U +X bashcompinit && bashcompinit
nécessaire que parce qu'un autre script comme git autocomplete ou le leur~/.zshrc
peut le faireautoload -U +X compinit && compinit
, mais il est prudent de les exécuter tous les deux.la source
-U
et+X
pour quoi ?+X foo
faire le même chargement automatique que l'invocationfoo
, mais sans l'exécuter immédiatement…autoload +X foo && foo
semble donc complètement redondant. Pouvez-vous expliquer pourquoi vous avez choisi ce modèle?autoload -U +X bashcompinit && bashcompinit
est que (en raison de la&&
) il exécuterabashcompinit
IFF le module est réellement trouvé. Normalautoload foo
renvoie toujours vrai. Plus tard, quand vous essayez d'exécuterfoo
, puis zsh enfin vous dit « fichier de définition de fonction not found ». Avecautoload +X
vous obtenez l'erreur immédiatement.autoload +X
charge la fonction sans l'exécuter - ce qui est plus queautoload
ne le fait, sans+X
. Sans+X
, le chargement automatique ne charge même pas la fonction; Il marque simplement le nom comme faisant référence à une fonction à charger ultérieurement. Le chargement réel n'est pas tenté tant que la fonction n'est pas appelée pour la première fois. Si vous souhaitez déterminer si la fonction nommée se charge correctement , vous devez utiliser+X
pour effectuer immédiatement l'étape de chargement.Pour
zsh
utilisation: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
la source
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 qu'Antigen ou OMZ (difficile à dire) se préoccupent uniquement du chargement des scripts de complétion à partir de leurs plugins. J'ai finalement contourné cela en chargeant automatiquement
bashcompinit
etcompinit
aprèsantigen apply
. Le chargement automatiquebashcompinit
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
.zcompdump
fichier$ANTIGEN_COMPDUMP
auquel pour moi était~/.antigen/.zcompdump
La ré-invocation de compinit et bashcompinit crée un second .zcompdump à
$HOME/.zcompdump
Tout cela semble fonctionner, car je peux utiliser les complétions configurées 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 générées lors de la tentative de tabulation complète, mais je ne sais pas 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:
la source
La réponse de @ JatinKumar m'a mis sur la bonne voie, mais j'ai dû utiliser à la
complete
place desource
. Donc tous ensemble:autoload -Uz compinit && compinit autoload -U +X bashcompinit && bashcompinit complete -C /usr/local/bin/terraform terraform complete -C /usr/local/aws/bin/aws_completer aws complete -C /usr/local/bin/az az
la source