Completamento automatico di Bash con spazi aggiunti: perché e come risolvere?


29

Uso il completamento con tabulazione più che scrivere lettere. Digitavo rm ~/De<TAB>e sarebbe stato completato in rm ~/Desktop/modo da poter continuare al livello successivo.

Recentemente, quel comportamento è cambiato. Il completamento ora produce rm ~/Desktop<SPACE>, il che significa che devo backspace e digitare la barra se voglio continuare. Questo mi fa piangere.

I cambiamenti sembrano essere situato nella funzione _longopt()di /etc/bash_completion, tuttavia, che è, per quanto posso seguire. Questo cambiamento è intenzionale e, in tal caso, a cosa serve? Posso riavere il vecchio comportamento, preferibilmente con un'opzione di configurazione invece di copiare il vecchio codice da qualche altro sistema?

Modifica: la funzione di riferimento.

_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
}

L'unico modo in cui ho potuto vedere che questo avrebbe senso è se ~ / Desktop è un file o una directory vuota . E nel secondo caso, è utile solo per comandi come rmdir, non per mkdiro touch.
1111

Potresti pubblicare il corpo della tua _longopt()funzione?
Aleksandr Levchuk,

@MPi: tenere presente che il completamento potrebbe dipendere dal comando (prima parola della riga di comando). Inoltre può dipendere dalle readlineimpostazioni (hai un ~/inputrcfile?) E dal fatto che l'elemento è una directory reale o un link simbolico a una directory.
enzotib,

Naturalmente il completamento dipende dalla prima parola della riga. Questo è il motivo per cui a volte uso un comando fantasy per ingannare il completamento e lo cambio solo al comando reale prima di inviarlo. E non ho più .inputrcsu questo sistema. (Erano i giorni, riparavano backspace e i tasti cursore ...) E succede per tutti gli elementi, directory o file, link simbolici o meno.
MPi,

1
Ottima domanda, ho osservato lo stesso identico comportamento e mi dà fastidio. Non ho idea del motivo, però.
Christoph,

Risposte:


22

Questo è un bug conosciuto. Vedi questa domanda LP e questi bug 1 2 .

Questo commento sembra essere la soluzione. Se non puoi aspettare che una correzione scorra verso il basso i canali normali, modifica la /etc/bash_completionriga 1587, defaultpassa a filenames(esegui prima un backup).


3
Riepilogo: è un bug, è possibile risolverlo localmente fino all'arrivo della patch modificando la /etc/bash_completionriga 1587, passare defaulta filenames.
MPi,

a cura della mia risposta
Christoph,

9

Ho avuto e risolto lo stesso problema dopo l'installazione di Adobe Reader su Ubuntu 12.04.

Ho commentato il _filedirblocco /etc/bash_completion.d/acroread.she ha funzionato di nuovo normalmente.


Alla data odierna questo è ciò che ha funzionato anche per me.
John Moeller,

1
Lo stesso qui: acroread lo ha innescato e commentando il _filedirblocco (in alto a destra) lo ha risolto. Devi disconnetterti o eseguire 'exec bash' in tutte le tue shell per vedere l'effetto, vedi questa domanda .
Dirkjot,

2

Ho avuto lo stesso problema e l'ho risolto rimuovendo la directory /etc/bash_completion.d/, quindi reinstallando bash_completion. Immagino che un vecchio file fosse in questa directory ... Spero che risolva anche il tuo problema.



2
Questo - anzi - l'ha risolto. Tuttavia, questo metodo è troppo radicale, poiché elimina molti completamenti. Dopo aver eliminato il pacchetto bash-completion, uno dei file rimanenti /etc/bash_completion.d/deve essere il colpevole. Era acroread.shnel mio caso - ridefinisce _filedir.
MPi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.