2010-02-26 16 views
9

Estoy tratando de crear un script de finalización de Bash para un programa Java. Una invocación típica de ese programa podría tener este aspecto:Agregue espacios al final de algunas opciones de autocompletar Bash, pero no a otras?

$ javaProgram -Dproperty=foo option1 option2 

Parte de mi guión será sugerir las diversas propiedades de Java que están disponibles para este programa (es decir, cuando el usuario teclea -D, el guión sugerirían, digamos, property=, permitiendo al usuario escribir el valor).

Me gustaría que la terminación no inserte un espacio después del signo igual. Sin embargo, cuando el usuario está escribiendo las diversas opciones para el programa (option1 y option2 en el ejemplo anterior), me gustaría que el script complete, e inserte un espacio cuando se complete.

Soy nuevo en las secuencias de comandos de finalización de Bash, pero conozco la opción nospace para el shell incorporado complete. No parece funcionar para el compgen incorporado, sin embargo, que parece lo que quiero. Intenté usar nospace, y luego explícitamente incluir espacios al final de las opciones apropiadas, pero parece que no lo están logrando.

¿Alguien sabe cómo obtener espacios al final de algunas opciones, pero sin espacios al final de otras?

Respuesta

1

Sería útil ver el código que tiene hasta ahora.

Sin embargo, mire el código de finalización para scp en /etc/bash_completion.d/ssh si tiene eso. Pone espacios después de nombres de archivo locales pero no después de nombres de host.

1

Dennis es justo en el dinero, en la función se hace referencia con complete -F _your_func, quieres algo como esto (tomado de/etc/bash_completion):

# escape spaces; remove executables, aliases, pipes and sockets; 
    # add space at end of file names 
    COMPREPLY=($(ssh -o 'Batchmode yes' $userhost \ 
       command ls -aF1d "$path*" 2>/dev/null | \ 
       sed -e "s/[][(){}<>\",:;^&!$&=?\`|\\ ']/\\\\\\\\\\\\&/g" \ 
       -e 's/[*@|=]$//g' -e 's/[^\/]$/& /g')) 
    return 0 

Este ejemplo particular utiliza la opción -o nospace pero añade la espacio de forma manual. Es el último -e ('s/[^\/]$/& /g') que agrega el espacio. En este caso, solo agrega si el último parámetro no termina en una barra inclinada (que sería un directorio y tiene archivos para autocompletarse).

La diferencia clave parece ser agregar un ampersand antes del espacio. Inténtalo y ve si funciona.

5

La característica en la terminación de bash de scp mencionada por C4H5As que conserva el espacio adicional no es el ampersand, es solo la sintaxis sed para "reemplazar con coincidencia".

Tienes que cambiar el IFS por lo compgen no se divide la entrada en espacios sino en saltos de línea o pestañas:

local IFS=$'\t\n' 
COMPREPLY=($(compgen -W "$options" -- $cur)) 
0

Puede hacerlo mediante la eliminación de espacios con la opción correspondiente, a continuación, añadir de nuevo manualmente las opciones donde desee, todo ello utilizando la sencilla -W ("lista de palabras") completado:

complete -o nospace -W 'Dproperty= "option1 " "option2 "' javaProgram 

completado automático ahora insertar un espacio después de option1 y option2, pero ninguno después Dproperty=.

Cuestiones relacionadas