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