Simule la respuesta COMPREPLY de Bash sin completarla realmente.
Pasos para reproducir
- Crea un directorio en tmp y agrega 1 archivo adentro.
mkdir /tmp/testdir && touch /tmp/testdir/examplefile
- Pega el siguiente script en
/tmp/completion.sh
# COMIENZO AUTOCOMPLETADO
function foocompletar() {
local comnum cur opts
[[ “${COMPWORDS[@]}” == *”-“* ]] && comnum=2 || comnum=1;
COMPREPLY=()
cur=”${COMPWORDS[COMPCWORD]}”
opts=”–help –restart -h -r”
if (( COMPCWORD > comnum )); then
COMPREPLY=( $(for filename in “/tmp/testdir/”; do echo ${filename##/}; done) )
return
fi
if [[ ${cur} == -* ]]; then
COMPREPLY=( $(compgen -W “${opts}” — ${cur}) )
return 0
else
COMPREPLY=( $(for filelist in /tmp/testdir/”$2″; do echo ${filelist##/}; done) )
fi
}
complete -F foocompletar foo.sh
# FIN AUTOCOMPLETADO -
Fuente luego.
. /tmp/completion.sh
Resultado esperado
$ foo.sh --restart examplefile <tab><tab>
examplefile
$ foo.sh --restart examplefile <tab><tab>
examplefile
$ foo.sh --restart examplefile <tab><tab>
examplefile
$ foo.sh --restart examplefile <tab><tab>
En cambio, sucede lo siguiente
$ foo.sh --restart examplefile <tab><tab> examplefile <tab><tab> examplefile <tab><tab> examplefile <tab><tab> examplefile <tab><tab> examplefile
Quiero que la sugerencia aparezca como completado posible, pero sin completarlo realmente (por motivos de visualización). Esta pregunta se ha hecho anteriormente, pero hasta la fecha no se ha dado ninguna respuesta.
En relación a -o nosort
Investigué esa opción y solo está disponible en Bash 4.4+, la probé en mi máquina 16.04 y falló. Busco una solución más “global”.
davy.ai
Desafortunadamente, sin usar la opción
-o nosort
o actualizar a Bash 4.4+ no hay una solución global para lograr el comportamiento deseado de mostrar sugerencias de autocompletado sin completar realmente la palabra. Una solución alternativa es usar la función_get_comp_words_by_ref
para acceder a la palabra actual que se está completando, y luego construir y mostrar manualmente las sugerencias de autocompletado sin completar realmente la palabra. Sin embargo, este enfoque requeriría modificar la función_foo_complete
en el script proporcionado.