Wymuś normalne uzupełnianie tabulacji w przypadku niepowodzenia inteligentnego uzupełniania

10

Odkąd uzupełnianie tabulatorów stało się standardową funkcją w powłokach, jestem z tego bardzo zadowolonym użytkownikiem. Podoba mi się nawet inteligentne zakończenie Basha (gdzie wyszukuje tylko pliki PDF, jeśli wpisuję evince foo <TAB>) - o ile poprawnie zgaduje.

Rujnuje skądinąd szczęśliwy dzień, gdy Bash wykorzystuje inteligentne uzupełnienie, aby odmówić ukończenia.

Dzisiaj chciałem:

tar xvf centos5.8_x86_1.ova

Więc wszedłem:

tar xvf cent<TAB>

a Bash odmawia ukończenia ścieżki, ponieważ pliki .ova nie są tym, czego zwykle używasz w tar.

Wiem, że mogę odinstalować pakiet bash-complete, aby usunąć inteligentne zakończenie. Ale czy mogę też zjeść ciasto i zjeść je?

Czy mogę poprosić bash, aby użył inteligentnego zakończenia, a jeśli to się nie powiedzie, a następnie skorzystaj z inteligentnego zakończenia?

Ole Tange
źródło
1
<spam> Zsh może to zrobić. </spam>
Gilles „SO- przestań być zły”

Odpowiedzi:

9

Poniższe czynności powinny włączyć normalne zakończenie bash po niepowodzeniu wszystkich „inteligentnych” zakończeń programów tar, vim i emacs:

compopt -o bashdefault tar vim emacs

zobacz także odpowiednią stronę w podręczniku bash online.

Zastrzeżenie: otrzymujesz normalne zachowanie dla rodzaju uzupełnienia (polecenia / nazwy plików / nazwy użytkownika itp.) Zdefiniowanego przez inteligentne uzupełnienie dla danego polecenia, na przykład uzupełnienie servicenie dokończy nazw plików, nawet jeśli zadzwonisz complete -o bashdefault service.

W tych i innych przypadkach, w których inteligentne autouzupełnianie kończy się niepowodzeniem, zawsze możesz nacisnąć Alt-/(lub M-/w notacji instrukcji bash), aby uzupełnić nazwy plików prawie w taki sam sposób, jak działa TAB, jeśli inteligentne uzupełnianie jest wyłączone (prawie w ten sam sposób, w tym sensie, że M-/nie kompletne wzory jak *.txt). Zobacz tutaj sekwencje klawiszy dla innych typów uzupełnień, takich jak nazwy poleceń i użytkowników.

Matthieu
źródło
2
Dzięki za wzmiankę Alt / nie miałem pojęcia, że ​​tam jest
Michael Speer
1

uzupełnianie bash jest rozszerzeniem standardowego uzupełniania basha i samo w sobie jest programem bash. Więc jeśli chcesz zmienić sposób działania programu, po prostu go zmień. To jest wolne oprogramowanie, możesz to zrobić. Dla konkretnego przypadku tarpolecenia plik to /usr/share/bash-completion/completions/tar. Aby tarautomatycznie ovauzupełnić plik z rozszerzeniem , wystarczy dodać go do wiersza

local tars='@(@(tar|gem|spkg)?(.@(Z|[gx]z|bz?(2)|lzma))|t@([glx]z|bz?(2)))'

tak mówi

local tars='@(@(tar|gem|spkg|ova)?(.@(Z|[gx]z|bz?(2)|lzma))|t@([glx]z|bz?(2)))'

Zauważ, że jest to ścieżka i kod istniejący dla Debian Wheezy (aktualna stabilna wersja). Inna dystrybucja lub wersja może mieć inny kod, ale pomysł jest taki sam. Otwórz kod i dostosuj, aby robił to, co chcesz.

Edycja: Właśnie zauważyłem, że pytanie dotyczyło za każdym razem, gdy nie można znaleźć dopasowania, a nie tylko konkretnego przypadku dodawania ovado tar. Może komuś może się przydać, żeby wiedzieć, gdzie może szukać źródła.

carandraug
źródło
4
Modyfikowanie plików w / usr, które są własnością menedżera pakietów, jest dobrym sposobem na wywołanie nieprzyjemnego wstrząsu podczas aktualizacji. Lepiej: zastąp konfigurację spakowaną.
Chris Down
1
@ChrisDown i jak byś to zrobił? Wciąż szukam czystego rozwiązania .bashrc.
Clayton Stanley