2010-10-17 8 views
5

En un script de finalización de bash, suponga COMPREPLY=(aa/ba/ aa/bb/). Cuando se invoca la secuencia de comandos, las opciones de finalización se ve así al usuario:Mostrando solo las subcadenas de COMPREPLY opciones de finalización de bash para el usuario

$ foo aa/b<TAB> 
aa/ba/ 
aa/bb/ 

Sin embargo, yo quiero tener un poco más de control sobre cómo se muestran estas opciones. En particular, quiero mostrar solamente una subcadena de cada opción COMPREPLY para el usuario, similar a cómo funciona la finalización de directorio en bash ahora:

$ foo aa/b<TAB> 
ba/ 
bb/ 

¿Hay alguna manera de hacer esto en bash?

Respuesta

5

que estaba teniendo el mismo problema y me fijo mediante el ajuste de la forma I unido la función de finalización de la orden. Sé que esto funciona cuando se trata de archivos reales en el sistema de archivos, creo que funcionará con cualquier tipo de ruta de archivo como opciones, pero no estoy seguro.

Antes:

complete -F _fubar fubar 

Después:

complete -o filenames -F _fubar fubar 

Para más detalles: Programmable Completion Builtins

+0

¡Impresionante! Ahora solo necesito descubrir cómo activar/desactivar selectivamente las opciones para diferentes casos 'COMPREPLY' en mi función, * sin * usando 'compopt' –

2

Esta pieza de código tomado de debian sid/etc/bash_completion debería ayudar:

# Remove colon-word prefix from COMPREPLY items 
local colon_word=${1%${1##*:}} 
local i=${#COMPREPLY[*]} 
while [ $((--i)) -ge 0 ]; do 
    COMPREPLY[$i]=${COMPREPLY[$i]#"$colon_word"} 
done 
+0

Gracias enzotib. Lamentablemente, esta técnica no funciona, porque luego la subcadena reemplaza la finalización completa. Es decir, 'foo aa/b ' se convierte en 'foo ba /' :-( –

Cuestiones relacionadas