Bash autouzupełnianie za pomocą polecenia vim

13

W bash, automatyczne uzupełnianie ścieżek ostatnio przestało działać podczas wydawania vimpoleceń, w których ścieżka jest głębsza niż dwa katalogi (nadal działa zgodnie z oczekiwaniami z innymi poleceniami, takimi jak lsi cd).

Na przykład, jeśli piszę, ls .config/btsync/bta następnie wciskam TAB, rozwija się do ls .config/btsync/btsync.conf.

Jeśli piszę, vim .config/bta następnie wciskam TAB, rozwija się do vim .config/btsync/.

Jednak vim .config/btsync/btpo wpisaniu, a następnie naciśnięciu klawisza TAB nic się nie dzieje (oczekiwałbym, że rozwinie się do vim .config/btsync/btsync.conf, jak w lspowyższym przykładzie).

Ten sam problem występuje podczas uruchamiania jako mój własny użytkownik i podczas uruchamiania jako su.

Przeczytałem ten post, który wspomniał o problemie ze starszymi wersjami bash-uzupełniania, ale korzystam z wersji 2.1-5.

AKTUALIZACJA: Po kilku dodatkowych testach odkryłem, że głównym problemem jest to, że bash uzupełni tylko nazwy katalogów, a nie nazwy plików.

AKTUALIZACJA: Okazuje się, że to bash-completionbyła ogólna przyczyna. Zobacz mój drugi komentarz do zaakceptowanej odpowiedzi.

Wszelkie sugestie dotyczące potencjalnej przyczyny takiego zachowania zostaną z wdzięcznością przyjęte!

TheRogueWolf
źródło
Opublikuj swoje .bashrc!
Gilles „SO - przestań być zły”
Link do mojego .bashrcwpisu, zgodnie z żądaniem.
TheRogueWolf
Usunięto linki do .bashrc, .aliases i .functions, które nie mają związku z problemem, gdy przyczyna została odkryta.
TheRogueWolf
ten sam problem na Debianie 9, niektóre instalacje, ale nie wszystkie: $
Philippe Gachoud

Odpowiedzi:

10

Zrobiłem dla ciebie więcej badań i oto, co znalazłem - kluczem do autouzupełniania jest bashpolecenie complete. Możesz wydrukować zasady vimużywania:

complete -p vim

Podobnie możesz usunąć te szczegółowe reguły za pomocą:

complete -r vim

To polecenie resetuje go do wartości domyślnych - zwykłe uzupełnianie ścieżek i nazw plików bez dodatkowej logiki. Prawdopodobnie tego chcesz.

Aby uzyskać więcej informacji, sprawdź help completelub man bashposzukaj sekcji o completepoleceniu (jest to wbudowana bash, stąd jest udokumentowana na stronie podręcznika bash).

Ostatni punkt - powyższe zmiany wpływają tylko na bieżącą bashsesję, jeśli chcesz usunąć reguły vim po każdym logowaniu complete -r vimdo swojego ~/.bashrc.

Mam nadzieję, że to pomoże :)

MLu
źródło
To zrobiło to. Wielkie dzięki. complete -p vimPolecenie zwrócone complete -F _filedir_xspec vimktóry został usunięty przez complete -r vimpolecenia rozwiązania problemu. Przeczytam completekomendę i informacje zwrócone przez przełącznik -p. Nieco zdziwiony, dlaczego to zachowanie się zmieniło, więc również to zbadam.
TheRogueWolf
3
Wygląda na to, że winowajcą było zakończenie. _filedir_xspecFunkcja w /usr/share/bash-completion/bash_completiondopełnia tylko katalogi. Odinstalowałem bash-completion, usunąłem complete -r vimwiersz z mojego .bashrci ponownie uruchomiłem i vimteraz działa zgodnie z oczekiwaniami.
TheRogueWolf
3

Domyślnie Bash automatycznie uzupełnia tylko ścieżki i nazwy plików. Jednak mechanizm jest rozszerzalny i można nauczyć bash wykonywania różnych autouzupełniania dla różnych programów. Na przykład gitmoże automatycznie uzupełniać nazwy poleceń podrzędnych (klonować, zatwierdzać) i zmiany zamiast tylko ścieżek. Czasami jest to przydatne, a czasem dość irytujące - na przykład, gdy gzip -dodmawia autouzupełniania nazw plików, które nie mają .gzrozszerzenia.

Zakończenie bash jest zwykle konfigurowane w /etc/bash_completion.d- prawdopodobnie znajdziesz tam wywołany plik vim. To plik zawierający reguły autouzupełniania dla vimwiersza poleceń.

Teraz masz dwie opcje:

  1. Albo napraw plik, aby ścieżki do autouzupełniania były zgodne z oczekiwaniami użytkowników.
  2. Usuń plik, aby wyłączyć specjalne vimreguły i wykonać tylko domyślną autouzupełnianie ścieżki.

I oczywiście zgłoś raport o błędzie, który opisuje problem, aby został naprawiony w przyszłych wersjach :)

MLu
źródło
Bardzo dziękuję za wspaniałe wyjaśnienie :) Zajrzałem do środka /etc/bash_completion.di jest tylko hgplik (dla Mercurial). Bardzo dziwny.
TheRogueWolf
1
To musi być gdzie indziej. Wypróbuj /usr/share/bash-completion/lub wyświetl listę wszystkich plików z vimpakietu lub z bashlub bash-completionpakietów (nie wiem, jak się nazywa w ArchLinux). Gdzieś tam będzie.
MLu,
1
Lista plików z bash-completionpokazów pakietów /usr/share/bash-completion/completionszawiera reguły dla wielu programów, ale nie vim. Pliki list zainstalowane z vimpakietem nie pokazują żadnych plików związanych z ukończeniem, a przeszukiwanie całego systemu za pomocą find / -name vimrównież nie pokazuje plików związanych z ukończeniem.
TheRogueWolf
2

Być może mógłbyś ponownie zainstalować bash-complete: apt-get install --reinstall bash-completion

I spójrz na plik /etc/bash.bashrc: nano /etc/bash.bashrc

I sprawdź, czy następujący wiersz nie ma komentarza:

if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi

Następnie zrestartuj sesję terminalową

Djidiouf
źródło
Próbowałem usunąć bash-completion, przetestować vimzachowanie, a następnie ponownie zainstalować bash-completioni przetestować, ale nadal napotykałem ten sam problem w obu okolicznościach. Wymienione linie nie są obecne /etc/bash.bashrc. Ta linia jest jednak[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
TheRogueWolf