Odbuduj indeks autouzupełniania (lub jak to się nazywa) i pliki binarne w pamięci podręcznej $ PATH w zsh


75

Po zainstalowaniu nowego oprogramowania, już otwarty terminal z zsh nie będzie wiedział o nowych poleceniach i nie będzie mógł wygenerować dla nich autouzupełniania. Najwyraźniej otwarcie nowego terminala rozwiązuje problem, ale czy indeks (lub jakkolwiek go nazwiesz) można odbudować, aby automatyczne uzupełnianie działało na starym terminalu?

Próbowałem z, compinitale to nie pomogło. Ponadto, czy istnieje sposób, który nie jest zależny od powłoki? Fajnie jest też mieć sposób na zweryfikowanie odpowiedzi (z wyjątkiem odinstalowania czegoś i ponownej instalacji).

Mam na myśli to, że po wpisaniu kilku znaków nazwy polecenia, mogę nacisnąć Tabi zshpowinienem zrobić resztę, aby wyświetlić pełną nazwę.


1
Istnieją dwa rodzaje autouzupełniania, które możesz mieć na myśli, mówiąc, że istniejąca powłoka „nie może wygenerować autouzupełniania dla [nowych poleceń]”: „uzupełnianie poleceń” - próba uzyskania powłoki sugerującej nazwę nowego polecenia podczas wypełniania w pozycji polecenia i „uzupełnianie argumentów” - próba nakłonienia powłoki do zasugerowania opcji / argumentów dla nowego polecenia, gdy już wpiszesz jego nazwę. Co sprawia ci problemy?
Chris Johnsen

1
Dobre pytanie! Zawsze zakładałem, że nie da się tego zrobić, nie pomyślałem o sprawdzeniu
Michał Mrożek

1
offtopic - ludzie są tak kapryśni 4 osoby faworyzowane, ale tylko 2 głosują za głosem ... Wydaje mi się dziwne, jak mało osób głosuje za tym.
ksenoterrakid,

@Chris Mam na myśli po wpisaniu kilku znaków nazwy polecenia i naciśnięciu klawisza tab, zsh powinien zrobić resztę i wyciągnąć pełną nazwę.
phunehehe

@xeno Też to zauważyłem; faworytowanie czegoś jest dość niezwykłe, ale nie głosowanie za nim
Michał Mrożek

Odpowiedzi:


76

Aby odbudować pamięć podręczną wykonywalnych poleceń, użyj rehashlub hash -rf.

Upewnij się, że nie odznaczyłeś tej hash_list_allopcji (powoduje to jeszcze mniejszy dostęp do dysku, ale rzadziej aktualizuje pamięć podręczną).

Jeśli nie chcesz wpisywać polecenia, możesz powiedzieć zsh, aby nie ufał swojej pamięci podręcznej podczas wypełniania, umieszczając następujący wiersz w swoim ~/.zshrc¹:

zstyle ":completion:*:commands" rehash 1

Występuje koszt wydajności, ale w typowych obecnie ustawieniach pulpitu jest nieistotny. (Nie dotyczy to systemu $PATHNFS lub systemu pozbawionego pamięci RAM).

Samo zstylepolecenie jest udokumentowane na zshmodulestronie man. Wartości stylów są udokumentowane na stronach zshcompsysi zshcompwidman, lub możesz przeczytać źródło (tutaj _command_namesfunkcji). Jeśli chciałeś mieć czytelną dokumentację… jeśli ją znajdziesz, daj mi znać!

¹ wymaga zsh ≥4,3.3, dzięki Chris Johnsen


3
Każda inkantacja powtórzenia powinna umożliwić uzupełnienie nazwy polecenia „nowymi poleceniami” w powłokach, które zostały wcześniej całkowicie zaszyfrowane. Ustawienie ŚCIEŻKI (lub ścieżki) spowoduje także ponowne użycie; w ten PATH="$PATH"sposób również wykona zadanie. HASH_LIST_ALLjest pokazany jako domyślny w mojej dokumentacji.
Chris Johnsen

To dla mnie odpowiedź.
BaiJiFeiLong

13

Jeśli masz problemy z uzyskaniem „uzupełniania argumentów” dla nowych poleceń, prawdopodobnie polecenie compinit jest prawdopodobnie potrzebne, ale ma mechanizm buforowania, który może powodować problem.

Dokumentacja mojej wersji (4.3.10) mówi, że compinit używa buforowanego „pliku zrzutu” .zcompdumpdo przechowywania skompilowanych funkcji uzupełniania w celu przyspieszenia kolejnych wywołań. Unieważnia plik zrzutu tylko wtedy, gdy zauważy zmianę liczby plików ukończenia ( fpathplików elementów rozpoczynających się od #compdef …lub #autoload …). Przypuszczalnie instalacja nowego oprogramowania zmieniłaby liczbę takich plików uzupełniających (zakładając, że zainstalowała także swoje pliki autouzupełniania zsh we właściwym miejscu), więc spodziewam się, że zwykły compinitzadziała. Jeśli jesteś w sytuacji, w której to nie działa, może być konieczne obejście lub ręczne unieważnienie pliku zrzutu.

Aby pominąć za pomocą pliku zrzutu, użyj compinit -D; wpłynie to tylko na bieżącą powłokę.

Aby odbudować plik zrzutu, usuń go i uruchom ponownie compinit:

rm -i ${ZDOTDIR:-${HOME:?No ZDOTDIR or HOME}}/.zcompdump &&
compinit

Wpłynie to na bieżącą powłokę, istniejące powłoki, które działają jako zwykłe compinit, i wszelkie przyszłe powłoki.


Niektóre frameworki zsh, takie jak zimzezwalają na użycie plików zrzutów na hosta. W takim przypadku usuń także $zcompdump_filerazem z .zcompdump.
sebastian
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.