Erstellen Sie den Index für die automatische Vervollständigung (oder wie auch immer er heißt) und die Binärdateien im $ PATH-Cache in zsh neu

75

Nach der Installation neuer Software weiß ein bereits geöffnetes Terminal mit zsh nichts über die neuen Befehle und kann für diese keine automatische Vervollständigung generieren. Das Öffnen eines neuen Terminals behebt anscheinend das Problem. Kann der Index (oder wie auch immer Sie ihn nennen) neu erstellt werden, sodass die automatische Vervollständigung auf dem alten Terminal funktioniert?

Ich habe es versucht, compinitaber das hat nicht geholfen. Gibt es auch einen Weg, der nicht von der Shell abhängig ist? Es ist schön, auch eine Möglichkeit zu haben, die Antwort zu überprüfen (außer, etwas zu deinstallieren und erneut zu installieren).

Ich meine, nachdem ich ein paar Zeichen des Befehlsnamens eingegeben habe, kann ich drücken Tabund zshsollte den Rest tun, um den vollständigen Namen abzurufen.

phunehehe
quelle
1
Es gibt zwei Arten der automatischen Vervollständigung, wenn Sie sagen, dass eine vorhandene Shell "keine automatische Vervollständigung für [die neuen Befehle] generieren kann": "Befehlsvervollständigung" - versucht, die Shell zu veranlassen, beim Vervollständigen den Namen des neuen Befehls vorzuschlagen an der Befehlsposition und „Argumentvervollständigung“: Versucht, die Shell zu veranlassen, Optionen / Argumente für den neuen Befehl vorzuschlagen, nachdem Sie seinen Namen bereits eingegeben haben. Was bereitet dir Probleme?
Chris Johnsen
1
Gute Frage! Ich hatte immer nur angenommen, dass es nicht geht, ich hätte nicht gedacht, das zu überprüfen
Michael Mrozek
1
offtopic - Leute sind so launisch, 4 Leute favorisiert, aber nur 2 upvote ... Ich finde es seltsam, wie wenige Leute Dinge upvote.
Xenoterracide
@Chris Ich meine, nachdem Sie ein paar Zeichen des Befehls eingegeben und die Tabulatortaste gedrückt haben, sollte zsh den Rest erledigen und den vollständigen Namen aufrufen.
Phunehehe
@ xeno Das habe ich auch gemerkt; Es ist ziemlich ungewöhnlich, etwas zu favorisieren, aber es nicht zu verbessern
Michael Mrozek

Antworten:

76

Verwenden Sie rehashoder, um den Cache ausführbarer Befehle neu zu erstellen hash -rf.

Stellen Sie sicher, dass Sie die hash_list_allOption nicht deaktiviert haben (dies führt zu noch weniger Festplattenzugriffen, führt jedoch zu weniger Cache-Aktualisierungen).

Wenn Sie keinen Befehl eingeben müssen, können Sie zsh anweisen, dem Cache nicht zu vertrauen, wenn Sie fertig sind, indem Sie die folgende Zeile in Ihr ~/.zshrc¹ einfügen:

zstyle ":completion:*:commands" rehash 1

Es gibt Leistungskosten, die bei einer typischen Desktop-Einstellung heutzutage jedoch vernachlässigbar sind. (Dies ist nicht der $PATHFall, wenn Sie NFS oder ein System ohne Arbeitsspeicher verwenden.)

Der zstyleBefehl selbst ist in der zshmoduleManpage dokumentiert . Die Stilwerte sind in den Manpages zshcompsysund dokumentiert zshcompwid, oder Sie können die Quelle (hier der _command_namesFunktion) lesen . Wenn Sie eine lesbare Dokumentation wünschen ... wenn Sie welche finden, lassen Sie es mich wissen!

¹ benötigt zsh≥4.3.3, danke Chris Johnsen

Gilles
quelle
3
Beide Wiederaufbereitungsbeschwörungen sollten die Vervollständigung von "neuen Befehlen" in Shells ermöglichen, die zuvor vollständig gehasht wurden. Das Einstellen von PATH (oder Pfad) führt auch zu einem erneuten Aufwärmen. also PATH="$PATH"würde das auch klappen. HASH_LIST_ALLwird in meiner Dokumentation standardmäßig angezeigt.
Chris Johnsen
Das ist die Antwort für mich.
BaiJiFeiLong
13

Wenn Sie Probleme haben, die Argumentvervollständigung für die neuen Befehle zum Laufen zu bringen, ist compinit wahrscheinlich der Befehl, den Sie benötigen. Es gibt jedoch einen Caching-Mechanismus, der möglicherweise Ihr Problem verursacht.

In der Dokumentation zu meiner Version (4.3.10) heißt es, dass compinit eine zwischengespeicherte "Dump-Datei" verwendet, .zcompdumpum kompilierte Vervollständigungsfunktionen zu speichern und nachfolgende Aufrufe zu beschleunigen. Die Sicherungsdatei wird nur ungültig, wenn eine Änderung der Anzahl der Vervollständigungsdateien ( fpathElementdateien, die mit #compdef …oder beginnen #autoload …) festgestellt wird . Vermutlich würde die Installation neuer Software die Anzahl solcher Vervollständigungsdateien ändern (vorausgesetzt, dass auch die zsh -Dateien für die automatische Vervollständigung an der richtigen Stelle installiert wurden ), so dass ich davon ausgehen würde, dass eine einfache Datei compinitfunktioniert. Wenn Sie sich in einer Situation befinden, in der dies nicht funktioniert, müssen Sie die Sicherungsdatei möglicherweise umgehen oder manuell ungültig machen.

Um die Dump-Datei zu überspringen, verwenden Sie compinit -D; Dies wirkt sich nur auf die aktuelle Shell aus.

Entfernen Sie die Sicherungsdatei, und führen Sie sie erneut aus, um sie neu zu erstellen compinit:

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

Dies wirkt sich auf die aktuelle Shell, vorhandene Shells, die normal ausgeführt werden compinit, und alle zukünftigen Shells aus.

Chris Johnsen
quelle
Einige zsh-Frameworks wie zimerlauben die Verwendung von Host-Dump-Dateien. In diesem Fall auch $zcompdump_filezusammen mit entfernen .zcompdump.
Sebastian