bash symfony autocomplete

bash - El autocompletado basado en Symfony rompe autocompletar SCP



autocomplete (1)

Esto probablemente no tiene nada que ver con tu robo compspec. Ni con la función de compleción _scp asociada con scp .

Probablemente se deba a tu COMP_WORDBREAKS=${COMP_WORDBREAKS//:} .

Has eliminado : de la lista de separadores. Aparentemente _scp es lo suficientemente robusto como para comportarse igual con o sin : como separador de palabras. Devuelve la misma lista de terminaciones candidatas. Pero el token que se sustituye cuando _scp devuelve solo un candidato para la finalización de, por ejemplo, scp host:public_ht , es host:public_ht , en lugar de solo public_ht . Prueba:

$ _foobar () { COMPREPLY=bazcux; return 0; } $ complete -o default -F _foobar foobar $ echo $COMP_WORDBREAKS "''><=;|&(:

Si intenta completar el foobar host:public_ht , obtiene el foobar host:bazcux porque el token sustituido es solo public_ht . Mientras con:

$ COMP_WORDBREAKS=${COMP_WORDBREAKS//:} $ echo $COMP_WORDBREAKS "''><=;|&(

si intenta completar el foobar host:public_ht , obtiene foobar bazcux porque es el host:public_ht completo host:public_ht que se reemplaza por bazcux .

La solución a su problema probablemente sea adaptar su función de finalización _robo modo que no requiera que : no sea un separador de palabras. Algo como:

_stem () { local lcur lprev lcur="$cur" stem="$lcur" for (( i = cword - 1; i >= 0; i -= 1 )); do lprev="${words[i]}" [[ $lcur == ":" ]] && [[ $lprev == ":" ]] && break [[ $lcur != ":" ]] && [[ $lprev != ":" ]] && break stem="$lprev$stem" lcur="$lprev" done } _robo () { local cur prev words cword _init_completion || return local stem options options=($(__robo_list_opts) $(__robo_list_cmds)) COMPREPLY=() _stem COMPREPLY=($(compgen -W ''${options[@]}'' -- "$stem")) [[ $stem =~ : ]] && stem=${stem%:*}: && COMPREPLY=(${COMPREPLY[@]#"$stem"}) return 0 } complete -o default -F _robo robo

Una solución mucho (aparentemente) más simple consiste en reemplazar la función _stem anterior por la función __reassemble_comp_words_by_ref existente de la biblioteca bash_completion :

_robo () { local cur prev words cword _init_completion || return __reassemble_comp_words_by_ref ":" words cword options=($(__robo_list_opts) $(__robo_list_cmds)) COMPREPLY=($(compgen -W ''${options[@]}'' -- "$cur")) return 0 } complete -o default -F _robo robo

Probablemente, todo esto no es exactamente lo que quieres. No conozco robo.il y probablemente haya muchas mejoras que tomarían más en cuenta el contexto para proponer terminaciones específicas. Pero puede ser un punto de partida.

Estoy usando las herramientas de PHP http://robo.li y n98-magerun.phar, ambas basadas en los componentes CLI de Sympfony.

Cuando uso una secuencia de comandos de autocompletar:

https://gist.github.com/caseyfw/51bdbcb37e5dfb91b74e #!/bin/sh function __robo_list_cmds () { robo list --raw | awk ''{print $1}'' | sort } function __robo_list_opts () { robo list --no-ansi | sed -e ''1,/Options:/d'' -e ''/^$/,$d'' -e ''s/^ *//'' -e ''s/ .*//'' | sort } _robo() { local cur="${COMP_WORDS[COMP_CWORD]}" COMPREPLY=($(compgen -W "$(__robo_list_opts) $(__robo_list_cmds)" -- ${cur})) return 0; } complete -o default -F _robo robo COMP_WORDBREAKS=${COMP_WORDBREAKS//:}

Rompe la autocompleta del comando scp (que generalmente completa los archivos en un servidor remoto, pero con esto - no relacionado - robo completado en su lugar, scp elimina el nombre de host del comando)

¿Porqué es eso? ¿Como arreglar?

EDITAR

basado en la respuesta, la versión fija está aquí:

https://gist.github.com/amenk/d68f1fe54b156952ced621f771ff48ba