Tengo un script de finalización de pestañas Bash para Hadoop de Apache. Normalmente, uso zsh como mi caparazón diario. Tiende a ser bastante parecido a un bash cuando lo necesito, pero parece que los sistemas de finalización de pestañas son radicalmente diferentes entre ellos. ¿Existe una forma sencilla de "convertir" las definiciones existentes de bash-tab-complete para que funcionen en zsh? No quiero invertir mucho tiempo en esto, pero si es fácil, ahorraría una cantidad moderada de esfuerzo.
fuente
/etc/zsh/zshrc
. Además, verifique los siguientes archivos en orden inverso (enumerados en el orden en que se han obtenido durante el inicio zsh):/etc/zsh/zshenv
,$ZDOTDIR/.zshenv
,/etc/zsh/zprofile
y$ZDOTDIR/.zprofile
(probablemente~/.zprofile
) para ver si laRCS
variable está desactivada. Si es así, evitaría que los archivos subsiguientes después del archivo en el que está desarmado se obtengan. Finalmente, verifique el shell para el usuario/etc/passwd
y asegúrese de que seazsh
y asegúrese de que no tenga un-f
argumento.autoload bashcompinit bashcompinit source /path/to/your/bash_completion_file
fuente
complete:13: command not found: compdef
error.if is-bash
marca en la parte superior._get_comp_words_by_ref
que no están definidos porbashcompinit
. Sin embargo, la mayoría de las terminaciones no usan esta función.autoload -U +X compinit && compinit autoload -U +X bashcompinit && bashcompinit source /path/to/your/bash_completion_script
Estoy ejecutando zsh
zsh 5.0.2 (x86_64-apple-darwin13.0)
sin ~ / .zshrc y la secuencia anterior funcionó en un shell zsh recién generado.Gracias al script git-completation.bash por la pista: D
Siga leyendo para obtener más detalles sobre las 3 líneas anteriores:
Bash tiene impresionantes en apoyo finalización automática incorporada, pero los scripts Bash autocompletar no trabajan directamente zsh zsh como el medio ambiente no tiene la función de autocompletar de bash esenciales funciones auxiliares como
compgen
,complete
. Lo hace en un esfuerzo por mantener rápida la sesión de zsh.En estos días, zsh se envía con scripts de finalización apropiados como
compinit
ybashcompinit
que tienen las funciones necesarias para admitir scripts de autocompletar bash.autoload <func_name>
: Tenga en cuenta que la carga automática se define en zsh y no en bash.autoload
busca un archivo nombrado en las rutas de directorio devueltas por elfpath
comando y marca una función para cargar el mismo cuando se invoca por primera vez.Por ejemplo, en mi sistema
echo $fpath
devuelve/usr/share/zsh/site-functions
y/usr/share/zsh/5.0.5/functions
y amboscompinit
ybashcompinit
están disponibles en/usr/share/zsh/5.0.5/functions
.Además, para la mayoría de las personas, es posible que solo
autoload -U +X bashcompinit && bashcompinit
sea necesario porque algún otro script como git autocomplete o el suyo propio~/.zshrc
pueden estar funcionandoautoload -U +X compinit && compinit
, pero es seguro ejecutar ambos.fuente
-U
y+X
para qué?+X foo
hacer la misma carga automática, simplemente invocandofoo
, pero sin ejecutarla inmediatamente ... así queautoload +X foo && foo
parece completamente redundante. ¿Puede explicar por qué eligió este patrón?autoload -U +X bashcompinit && bashcompinit
es que (debido a&&
) ejecutarábashcompinit
IFF, el módulo se encuentra realmente. Normalautoload foo
siempre devuelve verdadero. Más tarde, cuando se intenta ejecutarfoo
, a continuación, zsh finalmente le dice "archivo de definición de función no encontrado". Conautoload +X
obtienes el error de inmediato.autoload +X
carga la función sin ejecutarla, que es más deautoload
lo que hace, sin+X
. Sin+X
, la carga automática ni siquiera carga la función; Simplemente marca el nombre como una referencia a una función que se cargará más tarde. La carga real no se intenta hasta que se invoca la función por primera vez. Si desea determinar si la función nombrada se carga correctamente , debe utilizar+X
para realizar el paso de carga inmediatamente.Para
zsh
uso:compdef
compadd
Mi ejemplo:
# 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
Fuente: Mi código https://github.com/reduardo7/bashx
fuente
Estoy ejecutando Antigen como administrador de complementos Oh-My-Zsh. Tenía algunos scripts de finalización de bash escritos por compañeros de trabajo que quería cargar en Zsh con un simple
source /path/to/completion
.Tuve algunos problemas, porque parece que Antigen u OMZ (difícil de decir) se preocupan solo por cargar scripts de finalización desde sus complementos. Finalmente logré solucionar esto mediante la carga automática
bashcompinit
ycompinit
despuésantigen apply
. La simple carga automáticabashcompinit
no fue suficiente.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 crea su
.zcompdump
archivo en el$ANTIGEN_COMPDUMP
que para mí estaba~/.antigen/.zcompdump
La re-invocación de compinit y bashcompinit crea un segundo .zcompdump en
$HOME/.zcompdump
Eso parece a cabo todo el trabajo, porque soy capaz de utilizar las terminaciones creados por
/path/to/bash_completion
. He eliminado ambos archivos .zcompdump varias veces para asegurarme de que se regeneren y parezcan funcionar.Tuve que rm los archivos .zcompdump varias veces después de reiniciar la máquina debido a errores lanzados al intentar completar la pestaña, pero no estoy seguro de si eso se debe a esta configuración o algo más.
rm ~/.zcompdump && rm $ANTIGEN_COMPDUMP
y un nuevo caparazón me lo arregla.Versiones utilizadas al momento de escribir:
fuente
La respuesta de @JatinKumar me puso en el camino correcto, pero tuve que usar en
complete
lugar desource
. Así que todos juntos: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
fuente