Conclusão do Bash para 'unrar'

1

Quando bash-completion é carregado, unrar x é concluído após pressionar a guia em arquivos RAR no diretório.

Mas para arquivos multipartes com a nova convenção de nomenclatura, como

Filename.part01.rar
Filename.part02.rar
Filename.part03.rar

não há diferença entre o primeiro arquivo terminado em .part1.rar , .part01.rar ou .part001.rar e todas as outras partes como .part02.rar que nunca são abertas diretamente, elas são preenchidas all .

É possível configurar o bash-completion para que apenas a primeira parte dos arquivos RAR com várias partes seja concluída? Isso significa arquivos que terminam em .rar , mas não devem terminar em .part□.rar , em que □ é um número maior que 1 com zeros à esquerda (por exemplo, 2 ou 02 ou 002)?

O seguinte funciona para mim. Eu não sei se isso é 100% correto:

# unrar(1) completion                                      -*- shell-script -*-

_unrar()
{
    local cur prev words cword cmp_opts=1 i
    _init_completion || return

    # Check if all of the middle part are options.
    # If not, we break at the last-option idx, and won't complete opts.
    for ((i=1; i<${#words[@]}-1; i++)); do
        # not using the whole list for checking -- too verbose
        if [[ ${words[i]} != -* || ${words[i]} == '--' ]]; then
            cmp_opts=0
            break
        fi
    done

    if [[ $cur == -* ]] && ((cmp_opts)); then   # options
        COMPREPLY=( $( compgen -W '-ad -ap -av- -c- -cfg- -cl -cu -dh -ep -f
            -idp -ierr -inul -kb -o+ -o- -ow -p -p- -r -ta -tb -tn -to -u -v
            -ver -vp -x -x@ -y' -- "$cur" ) )
    elif ((cword == 1)); then                   # command
        COMPREPLY=( $( compgen -W 'e l lb lt p t v vb vt x' -- "$cur" ) )
    elif ((cword == i+1)); then                 # archive
        _filedir '[rR][aA][rR]'
        # If there is a second, third, ... ninth part
        for i in "${COMPREPLY[@]}"; do
            if [[ $i == *.part*(0)[2-9].[rR][aA][rR] ]]; then
                # Only look for the first, since it's the only useful one
                COMPREPLY=()
                _filedir 'part*(0)1.[rR][aA][rR]'
                break
            fi
        done
    else                                        # files.../path...
        _filedir
    fi

} &&
complete -F _unrar unrar

# ex: ts=4 sw=4 et filetype=sh
    
por wolf-revo-cats 21.02.2016 / 19:42

1 resposta

1

Veja o link para ter uma ideia de como essa filtragem pode ser feita.

Basicamente, você precisará pós-processar COMPREPLY[] de algumas maneiras para se livrar dos erros de conclusão. Você também pode adicionar um wrapper:

_mycomp_unrar(){
    local i
    _unrar "${[@]}" # use the old one
    # now copy the for i in "${COMPREPLY[]}" stuff
} &&
complete -p rar           # remove old completion
complete -F _mycomp_unrar # use your good new one

Ou você pode enviar uma solicitação pull (conforme mostrado acima) e ver o que acontece.

Adicionado o link para corrigir o problema de que a existência de partes parará os arquivos normais de aparecer. (O glob como um todo é .. ilegível.)

Agora, você também precisa copiar a parte if ((cmp_parts)) . Além disso, faça cmp_parts local.

    
por 04.03.2016 / 11:55