Automatyczne uzupełnianie Bash z dodanymi spacjami - dlaczego i jak to naprawić?

29

Używam uzupełniania tabulacji bardziej niż pisania liter. Kiedyś pisałem rm ~/De<TAB>i było to gotowe, aby rm ~/Desktop/móc kontynuować na wyższym poziomie.

Ostatnio to zachowanie się zmieniło. Ukończenie daje teraz wynik rm ~/Desktop<SPACE>, co oznacza, że ​​muszę cofnąć i wpisać ukośnik, jeśli chcę kontynuować. To sprawia, że ​​płaczę.

Wydaje się, że zmiany są zlokalizowane w funkcji _longopt()w /etc/bash_completion, ale o ile mogę to zrobić. Czy ta zmiana jest zamierzona, a jeśli tak, to po co jest dobra? Czy mogę odzyskać stare zachowanie, najlepiej za pomocą opcji config zamiast kopiowania starego kodu z innego systemu?

Edycja: funkcja w celach informacyjnych.

_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
źródło
Jedyny sposób, w jaki mogłem zobaczyć, że miałoby to sens, to to, że ~ / Desktop jest plikiem lub pustym katalogiem. A w drugim przypadku jest to przydatne tylko w przypadku poleceń typu „ rmdirnie” mkdirlub „ for” touch.
l0b0
Czy możesz opublikować treść swojej _longopt()funkcji?
Aleksandr Levchuk
@MPi: pamiętaj, że zakończenie może zależeć od polecenia (pierwsze słowo wiersza polecenia). Może to również zależeć od readlineustawień (masz ~/inputrcplik?) Oraz od faktu, że element jest prawdziwym katalogiem lub dowiązaniem symbolicznym do katalogu.
enzotib
Oczywiście zakończenie zależy od pierwszego słowa wiersza. Dlatego czasami używam komendy fantasy, aby oszukać, i zmieniam ją na prawdziwą, zanim ją wyślę. I nie mam już .inputrctego systemu. (To były dni, ustalanie klawiszy Backspace i kursorów…) I dzieje się tak w przypadku wszystkich elementów, katalogu lub pliku, dowiązania symbolicznego lub nie.
MPi
1
Doskonałe pytanie, obserwowałem dokładnie to samo zachowanie i to mnie denerwuje. Nie mam jednak pojęcia o przyczynie.
Christoph

Odpowiedzi:

22

To znany błąd. Zobacz to pytanie LP i te błędy 1 2 .

Ten komentarz wydaje się być poprawką. Jeśli nie możesz czekać, aż poprawka spłynie normalnymi kanałami, edytuj /etc/bash_completionwiersz 1587, zmień defaultna filenames(najpierw wykonaj kopię zapasową).

Christoph
źródło
3
Podsumowanie: Jest to błąd, możesz go naprawić lokalnie, dopóki łatka nie pojawi się, edytując /etc/bash_completionlinię 1587, zmień defaultna filenames.
MPi
zredagowałem moją odpowiedź
Christoph
9

Ten sam problem miałem i rozwiązałem po zainstalowaniu programu Adobe Reader w systemie Ubuntu 12.04.

Skomentowałem _filedirblok /etc/bash_completion.d/acroread.shi znów zadziałało normalnie.

hiteszradia
źródło
Na dzień dzisiejszy to też działało dla mnie.
John Moeller
1
To samo tutaj: acroread uruchomił go i _filedirnaprawił to, komentując blok (na górze). Musisz się wylogować lub uruchomić „exec bash” we wszystkich swoich powłokach, aby zobaczyć efekt, zobacz to pytanie .
dirkjot
2

Miałem ten sam problem i naprawiłem go, usuwając katalog /etc/bash_completion.d/, a następnie ponownie instalując bash_completion. Wydaje mi się, że w tym katalogu znajdował się stary plik ... Mam nadzieję, że rozwiąże on również twój problem.

PatrickM
źródło
jak ten facet: timlabath.com/words/2011/05/10/…
wpisz
2
Naprawdę to naprawiło. Jednak ta metoda jest zbyt radykalna, ponieważ odrzuca wiele uzupełnień. Po usunięciu pakietu bash-completionjeden z pozostałych plików /etc/bash_completion.d/musi być winowajcą. Tak było acroread.shw moim przypadku - redefiniuje _filedir.
MPi