Conclusão automática do Bash com espaços adicionais - por que e como corrigir?

29

Eu uso a conclusão de tabulação mais do que digitar letras. Eu costumava digitar rm ~/De<TAB>e isso seria concluído para rm ~/Desktop/que eu pudesse continuar no próximo nível.

Recentemente, esse comportamento mudou. A conclusão agora produz rm ~/Desktop<SPACE>, o que significa que eu devo retroceder e digitar a barra se quiser continuar. Isso me faz chorar.

As mudanças parecem estar localizados na função _longopt()em /etc/bash_completion, no entanto, que é, tanto quanto eu posso seguir. Essa mudança é intencional e, em caso afirmativo, para que serve? Posso ter o comportamento antigo de volta, preferencialmente por uma opção de configuração, em vez de apenas copiar o código antigo de outro sistema?

Edit: A função para referência.

_longopt()
{
    local cur prev split=false
    _get_comp_words_by_ref -n = cur prev

    _split_longopt && split=true

    case "$prev" in
        --*[Dd][Ii][Rr]*)
            _filedir -d
            return 0
            ;;
        --*[Ff][Ii][Ll][Ee]*|--*[Pp][Aa][Tt][Hh]*)
            _filedir
            return 0
            ;;
    esac

    $split && return 0

    if [[ "$cur" == -* ]]; then
        COMPREPLY=( $( compgen -W "$( $1 --help 2>&1 | \
            sed -ne 's/.*\(--[-A-Za-z0-9]\{1,\}\).*/\1/p' | sort -u )" \
            -- "$cur" ) )
    elif [[ "$1" == @(mk|rm)dir ]]; then
        _filedir -d
    else
        _filedir
    fi
}
MPi
fonte
A única maneira de ver que isso faria sentido é se ~ / Desktop for um arquivo ou um diretório vazio . E no segundo caso, isso é útil apenas para comandos como rmdir, não para mkdirou touch.
L0b0
Você poderia postar o corpo da sua _longopt()função?
Aleksandr Levchuk
@ MPi: saiba que a conclusão pode depender do comando (primeira palavra da linha de comando). Também depende das readlineconfigurações (você possui um ~/inputrcarquivo?) E do fato de o item ser um diretório real ou um link simbólico para um diretório.
Enzotib
Claro que a conclusão depende da primeira palavra da linha. É por isso que às vezes uso um comando de fantasia para enganar a conclusão e apenas o altero para o comando real antes de enviá-lo. E eu não tenho mais .inputrcesse sistema. (Aqueles eram os dias, corrigindo backspace e teclas do cursor ...) E isso acontece para todos os elementos, diretório ou arquivo, link simbólico ou não.
MPi
11
Excelente pergunta, observei exatamente o mesmo comportamento e isso me irrita. Nenhuma idéia sobre o motivo, no entanto.
Christoph

Respostas:

22

Esse é um problema conhecido. Veja esta pergunta do LP e esses bugs 1 2 .

Este comentário parece ser a correção. Se você não puder esperar uma correção chegar aos canais normais, edite a /etc/bash_completionlinha 1587, altere defaultpara filenames(faça um backup primeiro).

Christoph
fonte
3
Resumo: É um bug, você pode corrigi-lo localmente até que o patch chegue editando a /etc/bash_completionlinha 1587, altere defaultpara filenames.
MPi
editou minha resposta
Christoph
9

Eu tive e resolvi o mesmo problema depois de instalar o Adobe Reader no Ubuntu 12.04.

Eu comentei o _filedirbloco /etc/bash_completion.d/acroread.she funcionou normalmente novamente.

hiteshradia
fonte
Até a data de hoje, foi isso que funcionou para mim também.
precisa
11
O mesmo aqui: o acroread o acionou e comentou o _filedirbloco (logo em cima) o corrigiu. Você precisa sair ou executar 'exec bash' em todos os seus shells para ver o efeito, consulte esta pergunta .
dirkjot
2

Eu tive o mesmo problema e o corrigi removendo o diretório /etc/bash_completion.d/ e reinstale o bash_completion. Eu acho que um arquivo antigo estava nesse diretório ... Espero que ele também resolva o seu problema.

PatrickM
fonte
como esse cara: timlabath.com/words/2011/05/10/…
type
2
Isso - de fato - o corrigiu. No entanto, esse método é radical demais, pois descarta muitas conclusões. Após excluir o pacote bash-completion, um dos arquivos restantes /etc/bash_completion.d/deve ser o culpado. Foi acroread.shno meu caso - redefine _filedir.
MPi