Conclusão inteligente de bash dependendo da posição do argumento

1

Eu tenho uma função bash simples, um wrapper em torno do scp basicamente. Chamado usando

copytomachine <Machine> <File>

Eu configurei um auto complete simples de tal forma que quando eu digito

copytomachine <TAB><TAB>

Ele me apresenta uma lista das máquinas disponíveis, apenas uma sequência codificada no momento, o que é bom para minhas necessidades.

Se, no entanto, eu digitar

copytomachine BUILD_SERVER <TAB><TAB>

Eu gostaria que ele oferecesse uma lista de arquivos em meu diretório e pudesse completar automaticamente seus caminhos, etc. No entanto, eu não quero que essa lista de arquivos seja apresentada para o primeiro parametro (o nome da máquina) .

Meu script de conclusão atual se parece com:

_machines_completions()
{
    local opts
    opts="BUILD_SERVER TEST_SERVER LOCAL_MACHINE"
    COMPREPLY=( $(compgen -W "${opts}" -- ${COMP_WORDS[COMP_CWORD]}) )
    return 0
}

Alguém pode aconselhar como eu posso modificar isso para permitir que eu complete tab para esses nomes de máquina definidos para o parâmetro 1 e complete a tabulação para nomes de arquivos no parâmetro 2?

    
por Joey O 01.09.2017 / 11:35

1 resposta

2

Como COMP_CWORD é o número da palavra, você pode testar seu valor:

_machines_completions()
{
    local opts
    opts="BUILD_SERVER TEST_SERVER LOCAL_MACHINE"
    case $COMP_CWORD in
        1)
            COMPREPLY=( $(compgen -W "${opts}" -- "${COMP_WORDS[COMP_CWORD]}") )
            ;;
        2)
            COMPREPLY=( $(compgen -o default -- "${COMP_WORDS[COMP_CWORD]}") )
            ;;
    esac
    return 0
}

-o default :

Use Readline’s default filename completion if the compspec generates no matches.

    
por 01.09.2017 / 11:59