Obter string de comando na conclusão do ZSH

1

'Dada a seguinte conclusão:

$ cat _anssh
#compdef anssh

_anssh () {
    _arguments '-i[inventory file]:filename:->files'
    case "$state" in
        files)
            _anssh_inventories_show
            ;;
        *)
            _anssh_hosts_show
            ;;
    esac
}

_anssh_inventories_show () {
    local -a inventories
    inventories=("${(@f)$(find hosts -maxdepth 1 -type f -printf 'hosts/%f\n')}")
    _multi_parts / inventories
}

_anssh_hosts_show () {
    local inv=$(echo $@ | sed 's/.*\-i\s*//g' | awk '{print $1}')
    local invflag=""
    if [ "$inv" != "" ]; then
        invflag="--inventory $inv"
    fi
    local hosts=("${(s/ /)$(anssh $invflag -l)}")
    _values 'hosts' $hosts
}

A parte que não funciona é que _anssh_host_show deve retornar valores diferentes dependendo de como -i é definido (se estiver definido). Eu tento extrair o valor de -i de $@ (que eu espero que seja o comando completo digitado até agora), mas $@ está vazio no contexto da conclusão. Como faço para obter essa string?

    
por sontags 22.11.2016 / 17:16

1 resposta

0

Isso faz o truque:

#compdef anssh

local -a command

_anssh () {
    command="$words"
    _arguments '-i[inventory file]:filename:->files'
    case "$state" in
        files)
            _anssh_inventories_show
            ;;
        *)
            _anssh_hosts_show
            ;;
    esac
}

_anssh_inventories_show () {
    local -a inventories
    inventories=("${(@f)$(find hosts -maxdepth 1 -type f -printf 'hosts/%f\n')}")
    _multi_parts / inventories
}

_anssh_hosts_show () {
    local inv=$(echo $command | grep ' -i' | sed 's/.*\-i\s*//g' | awk '{print $1}')
    local invflag=""
    if [ "$inv" != "" ]; then
        invflag="-i $inv"
    fi
    local hosts=("${(s/ /)$(anssh $invflag -l)}")
    _values 'hosts' $hosts
}

_anssh
    
por 22.11.2016 / 18:37