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/zprofiley$ZDOTDIR/.zprofile(probablemente~/.zprofile) para ver si laRCSvariable 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/passwdy asegúrese de que seazshy asegúrese de que no tenga un-fargumento.autoload bashcompinit bashcompinit source /path/to/your/bash_completion_filefuente
complete:13: command not found: compdeferror.if is-bashmarca en la parte superior._get_comp_words_by_refque 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_scriptEstoy 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
compinitybashcompinitque 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.autoloadbusca un archivo nombrado en las rutas de directorio devueltas por elfpathcomando y marca una función para cargar el mismo cuando se invoca por primera vez.Por ejemplo, en mi sistema
echo $fpathdevuelve/usr/share/zsh/site-functionsy/usr/share/zsh/5.0.5/functionsy amboscompinitybashcompinitestá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 && bashcompinitsea necesario porque algún otro script como git autocomplete o el suyo propio~/.zshrcpueden estar funcionandoautoload -U +X compinit && compinit, pero es seguro ejecutar ambos.fuente
-Uy+Xpara qué?+X foohacer la misma carga automática, simplemente invocandofoo, pero sin ejecutarla inmediatamente ... así queautoload +X foo && fooparece completamente redundante. ¿Puede explicar por qué eligió este patrón?autoload -U +X bashcompinit && bashcompinites que (debido a&&) ejecutarábashcompinitIFF, el módulo se encuentra realmente. Normalautoload foosiempre 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 +Xobtienes el error de inmediato.autoload +Xcarga la función sin ejecutarla, que es más deautoloadlo 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+Xpara realizar el paso de carga inmediatamente.Para
zshuso:compdefcompaddMi 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; fiFuente: 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
bashcompinitycompinitdespuésantigen apply. La simple carga automáticabashcompinitno 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_completionAntigen crea su
.zcompdumparchivo en el$ANTIGEN_COMPDUMPque para mí estaba~/.antigen/.zcompdumpLa re-invocación de compinit y bashcompinit crea un segundo .zcompdump en
$HOME/.zcompdumpEso 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_COMPDUMPy 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
completelugar 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 azfuente