2011-03-14 6 views
12

Actualmente tengo un archivo de finalización de Bash que completa un solo parámetro de una lista de comandos permitidos para un script (llamado "pbt"). Este es el archivo de Terminación Bash trabajo:Finalización de Bash de nivel múltiple

_pbt_complete() 
{ 
    local cur goals 

    COMPREPLY=() 
    cur=${COMP_WORDS[COMP_CWORD]} 
    goals='asadmin clean deploy' 
    cur=`echo $cur` 
    COMPREPLY=($(compgen -W "${goals}" ${cur})) 
} 

complete -F _pbt_complete pbt 

Así que si llamo

pbt <tab> 

Bash completa de todos los comandos permitidos (asadmin, limpio, desplegar), lo cual está bien.

Ahora quiero agregar un "segundo" nivel a la finalización. Así por ejemplo, si el tipo i

pbt asadmin <tab> 

se debe completar todas las opciones que sólo están disponibles en el "medio ambiente" asadmin- (que también me definiré dentro del archivo finalización bash), digamos por ejemplo pbt asadmin [start-domain|stop-domain] Pero si yo escriba

pbt deploy <tab> 

se debe completar a otro conjunto de opciones, por ejemplo pbt deploy [all|current]. Entonces las opciones para el segundo comando siempre deben depender del primer comando. ¿Cómo puedo hacer eso en el archivo de finalización?

+1

¿Ha instalado o revisado el paquete bash-completion? http://bash-completion.alioth.debian.org/ Los módulos p4 y apt hacen esto. – mkb

Respuesta

19

Gracias al comentario de mkb miré en el p4-example, que era, a diferencia del ejemplo de Git;) lo suficientemente simple para adaptarlo a mi caso. Aquí está la versión de trabajo que hace exactamente lo que solicité:

have pbt && 
_pbt_complete() 
{ 
    local cur prev 

    COMPREPLY=() 
    cur=${COMP_WORDS[COMP_CWORD]} 
    prev=${COMP_WORDS[COMP_CWORD-1]} 

    if [ $COMP_CWORD -eq 1 ]; then 
    COMPREPLY=($(compgen -W "asadmin deploy" -- $cur)) 
    elif [ $COMP_CWORD -eq 2 ]; then 
    case "$prev" in 
     "asadmin") 
     COMPREPLY=($(compgen -W "start-domain stop-domain" -- $cur)) 
     ;; 
     "deploy") 
     COMPREPLY=($(compgen -W "all current" -- $cur)) 
     ;; 
     *) 
     ;; 
    esac 
    fi 

    return 0 
} && 
complete -F _pbt_complete pbt 
2

Es posible que desee ver cómo se realiza la finalización de Git, por ejemplo. (Esto toma 2257 líneas de definiciones de función y 14 variables adicionales en mi configuración de bash).

Cuestiones relacionadas