Automatische Bash-Vervollständigung mit zusätzlichen Leerzeichen - warum und wie?

29

Ich benutze die Tabulatorvervollständigung mehr als die Eingabe von Buchstaben. Früher habe ich getippt rm ~/De<TAB>und es wurde so ergänzt, rm ~/Desktop/dass ich mit dem nächsten Level weitermachen konnte.

Vor kurzem hat sich dieses Verhalten geändert. Die Vervollständigung ergibt nun rm ~/Desktop<SPACE>, was bedeutet, dass ich die Rücktaste drücken und den Schrägstrich eingeben muss, um fortzufahren. Das bringt mich zum Weinen.

Die Änderungen scheinen in der Funktion _longopt()zu liegen /etc/bash_completion, aber das ist soweit ich folgen kann. Ist diese Änderung beabsichtigt und wenn ja, wofür ist sie gut? Kann ich das alte Verhalten wiederherstellen, vorzugsweise durch eine Konfigurationsoption, anstatt nur den alten Code von einem anderen System zu kopieren?

Bearbeiten: Die Referenzfunktion.

_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
quelle
Der einzige Weg, wie ich sehen konnte, dass dies sinnvoll ist, ist, wenn ~ / Desktop eine Datei oder ein leeres Verzeichnis ist. Und im zweiten Fall ist das nur nützlich für Befehle wie rmdir, nicht für mkdiroder touch.
10.
Könnten Sie den Körper Ihrer _longopt()Funktion posten ?
Aleksandr Levchuk
@MPi: Beachten Sie, dass die Ausführung vom Befehl abhängen kann (erstes Wort der Befehlszeile). Dies kann auch von den readlineEinstellungen (haben Sie eine ~/inputrcDatei?) Und der Tatsache abhängen , dass es sich bei dem Objekt um ein echtes Verzeichnis oder einen Symlink zu einem Verzeichnis handelt.
Enzotib
Natürlich hängt die Vervollständigung vom ersten Wort der Zeile ab. Aus diesem Grund verwende ich manchmal einen Fantasiebefehl, um die Vervollständigung auszutricksen, und ändere ihn erst in den tatsächlichen Befehl, bevor ich ihn sende. Und ich habe kein .inputrcauf diesem System mehr. (Das waren die Tage, als man die Rücktaste und die Cursortasten festlegte…) Und das passiert für alle Elemente, Verzeichnis oder Datei, Symlink oder nicht.
MPi
1
Hervorragende Frage, ich habe genau dasselbe Verhalten beobachtet und es ärgert mich. Keine Ahnung über den Grund.
Christoph

Antworten:

22

Dies ist ein bekannter Fehler. Siehe diese LP-Frage und diese Bugs 1 2 .

Dieser Kommentar scheint die Lösung zu sein. Wenn Sie nicht darauf warten können, dass ein Update die normalen Kanäle herunterläuft, bearbeiten Sie die /etc/bash_completionZeile 1587 und ändern Sie sie defaultin filenames(erstellen Sie zuerst ein Backup).

Christoph
quelle
3
Zusammenfassung: Es ist ein Fehler, können Sie es lokal beheben , bis die Patch bearbeite ankommt /etc/bash_completionLinie 1587, Änderung defaultzu filenames.
MPi
bearbeitete meine Antwort
Christoph
9

Ich hatte und löste das gleiche Problem nach der Installation von Adobe Reader unter Ubuntu 12.04.

Ich habe den _filedirBlock in auskommentiert /etc/bash_completion.d/acroread.shund es hat wieder normal funktioniert.

Hiteshradia
quelle
Ab dem heutigen Datum hat dies auch für mich funktioniert.
John Moeller
1
Gleiches gilt hier: acroread hat es ausgelöst und das Auskommentieren des _filedirBlocks (rechts oben) hat es behoben. Sie müssen sich abmelden oder "exec bash" in allen Ihren Shells ausführen, um den Effekt zu sehen . Siehe diese Frage .
Dirkjot
2

Ich hatte das gleiche Problem und habe es behoben, indem ich das Verzeichnis /etc/bash_completion.d/ entfernt und dann bash_completion neu installiert habe. Ich denke, eine alte Datei war in diesem Verzeichnis ... Hoffentlich wird es auch Ihr Problem lösen.

PatrickM
quelle
2
Dies - in der Tat - hat es behoben. Diese Methode ist jedoch viel zu radikal, da sie viele Vervollständigungen wegwirft. Nach dem Löschen des Pakets bash-completionmuss eine der verbleibenden Dateien /etc/bash_completion.d/der Schuldige sein. Es war acroread.shin meinem Fall - es definiert neu _filedir.
MPi