2012-04-12 7 views
5

Estoy creando una función para proporcionar la finalización programable para un comando que uso (con mucha ayuda desde http://www.debian-administration.org/articles/317). El uso script es como sigue:Espacio final condicional con finalización programable bash

script.sh command [command options] 

donde comando puede ser o bien 'foo' o 'bar' y opciones de comando de 'foo' son 'a_foo = valor' y 'b_foo = valor' y opciones de comando para 'bar' son 'a_bar = value' y 'b_bar = value'.

Aquí está la configuración que estoy usando:

_script() { 
    local cur command all_commands                  
    COMPREPLY=() 
    cur="${COMP_WORDS[COMP_CWORD]}" 
    command="${COMP_WORDS[1]}" 
    all_commands="foo bar" 
    case "${command}" in 
    foo) 
     COMPREPLY=($(compgen -W "--a_foo --b_foo" -- ${cur})); return 0;; 
    bar) 
     COMPREPLY=($(compgen -W "--a_bar --b_bar" -- ${cur})); return 0;; 
    *) ;; 
    esac 
    COMPREPLY=($(compgen -W "${all_commands}" -- ${cur})) 
    return 0 
} 

complete -F _script script.sh 

Esto funciona sobre todo como me gustaría:

% script.sh f[TAB] 

completa a:

% script.sh foo 

(con un espacio al final como se desee)

Sin embargo, esto:

% script.sh foo a[TAB] 

completa a:

% script.sh foo a_foo 

(también con un espacio al final)

Me gustaría reemplazar el espacio final con un '='. Alternativamente, estaría dispuesto a cambiar los valores pasados ​​a compgen por "--a_foo = --b_foo =", en cuyo caso podría eliminar el espacio final.

Desafortunadamente, el comando no está bajo mi control, así que no puedo cambiar las opciones de línea de comando para que tengan el formato "--a_foo value" en lugar de "--a_foo = value".

Respuesta

8

En primer lugar es necesario agregar = a la COMPREPLY:

COMPREPLY=($(compgen -W "--a_foo= --b_foo=" -- ${cur})) 

continuación, tiene que decirle a la finalización de no agregar espacio después = con

compopt -o nospace 

es así, líneas de guión debe ser:

foo) 
    COMPREPLY=($(compgen -W "--a_foo= --b_foo=" -- ${cur})); compopt -o nospace; return 0;; 
bar) 
    COMPREPLY=($(compgen -W "--a_bar= --b_bar=" -- ${cur})); compopt -o nospace; return 0;; 
+0

Perfecto ... gracias. Veo el componente ahora en las páginas de bash man. ¡Probablemente debería mencionarse en la sección de Finalización programable! –

+2

Siempre miro http://bash-completion.alioth.debian.org/ si estoy atascado con terminaciones. Supongo que no existe ninguna característica que no se use en este proyecto ;-) – Cougar

+1

¿Hay alguna forma de hacerlo en bash 3.X? el componente parece existir solo en bash4 y el mac aún no viene con él por defecto. – bjorns

Cuestiones relacionadas