Arquivos completos de um diretório diferente no bash [duplicado]

5

Eu escrevi duas funções push e pull para copiar arquivos de e para um diretório ( $FILE_EXCHANGE_DIR ). Eu quero bash para autocompletar nomes desse diretório quando eu uso a função pull . Eu quero que o autocompletar tenha apenas nomes do diretório mencionado. No formulário atual, meu preenchimento automático também encontra nomes dos arquivos no diretório atual, independentemente de haver ou não uma correspondência no diretório de origem ( $FILE_EXCHANGE_DIR ).

Aqui estão duas versões da função que passei para complete . Nenhum deles funcionou.

_pull () {
    local cmd="${1##*/}";
    local word=${COMP_WORDS[COMP_CWORD]};
    local line=${COMP_LINE};
    filelist=( $(ls ${FILE_EXCHANGE_DIR} ) )

    local TEMP_COMPREPLY=( $(compgen -W "${filelist[@]}" -- ${word} ) )

    COMPREPLY=( "${TEMP_COMPREPLY[@]}" )
    return 0;
}

_pull () 
{
    local word=${COMP_WORDS[COMP_CWORD]};
    local line=${COMP_LINE};
    local pat="$FILE_EXCHANGE_DIR/*"

    COMPREPLY=($(compgen -f -G "$pat" -- "$FILE_EXCHANGE_DIR/${word}"));

    i=0
    for item in "${COMPREPLY[@]}"; do
        COMPREPLY[$i]="${item##*/}"
        i+=1
    done;
    return 0;
}

No final, eu faço

complete -f -F _pull pull

Existe uma boa maneira de completar nomes apenas de um diretório (que não é o atual) e não do atual? Mesmo no caso em que não houve correspondência na fonte (qual deve ser o padrão para readline preenchimento padrão?

    
por Wojtek Rzepala 15.03.2012 / 16:12

1 resposta

7

Se bem entendi, isso deve ser o que você está procurando:

_pull () {
    # Set
    IFS=$'\n' tmp=( $(compgen -W "$(ls "$FILE_EXCHANGE_DIR")" -- "${COMP_WORDS[$COMP_CWORD]}" ))
    COMPREPLY=( "${tmp[@]// /\ }" )
}
complete -o default -F _pull pull

Até escapa de espaços em nomes de arquivos.

Observe que -o default é concluído com o padrão readline , mas isso não parece ser nada, a menos que você o defina explicitamente em algum lugar ( .initrc ?). Se você quiser nomes de arquivos, use -o filenames ou use -f .

    
por 15.03.2012 / 21:13