web-dev-qa-db-fra.com

Reconstruire l'index complet automatique (ou quoi que ce soit appelé) et des fichiers binaires dans $ path cache dans zsh

Après avoir installé un nouveau logiciel, un terminal déjà ouvert avec ZSH ne saura pas sur les nouvelles commandes et ne peut pas générer automatiquement à ceux-ci. Apparemment, ouvrir un nouveau terminal corrige le problème, mais l'index (ou tout ce que vous l'appelez) soit reconstruit de sorte que l'automobile fonctionne sur l'ancien terminal?

J'ai essayé avec compinit mais cela n'a pas aidé. Aussi, y a-t-il un moyen qui n'est pas dépendant de la coque? C'est bien d'avoir un moyen de vérifier également la réponse (à l'exception de la désinstallation de quelque chose et de la réinstaller).

Ce que je veux dire, c'est après avoir tapé quelques caractères de nom de commande, je peux appuyer sur Tabet zsh devrait faire le reste pour retirer le nom complet.

80
phunehehe

Pour reconstruire le cache des commandes exécutables, utilisez rehash ou hash -rf.

Assurez-vous que vous n'avez pas non pas défini le hash_list_all Option (il provoque encore moins d'accès au disque, mais rend la mise à jour du cache moins souvent).

Si vous ne voulez pas avoir à taper une commande, vous pouvez dire à ZSH de ne pas faire confiance à son cache lors de la finalisation en mettant la ligne suivante dans votre ~/.zshrc¹:

zstyle ":completion:*:commands" rehash 1

Il y a un coût de performance, mais il est négligeable sur un cadre de bureau typique aujourd'hui. (Ce n'est pas si vous avez $PATH sur NFS, ou un système RAM-Smart.)

La commande zstyle est documentée dans la page zshmodule manuel. Les valeurs de styles sont documentées dans les pages zshcompsys et zshcompwid, ou vous pouvez lire la source (ici, de la _command_names fonction). Si vous vouliez une documentation lisible ... si vous en trouvez quelques-uns, laissez-moi savoir!

¹ nécessite zsh≥4.3.3, merci Chris Johnsen

Si vous rencontrez des problèmes pour obtenir une "achèvement de l'argument" fonctionnant pour les nouvelles commandes, alors compintement est probablement la commande dont vous avez besoin, mais il a un mécanisme de mise en cache qui pourrait causer votre problème.

La documentation pour ma version (4.3.10) indique que compince utilise un "fichier de vidage" mis en cache, .zcompdump, pour stocker des fonctions d'achèvement compilées pour accélérer les invocations ultérieures. Il n'invalide que le fichier de vidage lorsqu'il notine une modification du nombre de fichiers d'achèvement (fpath éléments commençant par #compdef … ou #autoload …). En règle générale, l'installation de nouveaux logiciels modifierait le nombre de fichiers d'achèvement (supposant que cela a également installé ses fichiers automatiques ZSH au bon endroit), alors je m'attendrais à ce qu'une simple compinit à travail. Si vous êtes dans une situation dans laquelle il ne fonctionne pas, vous devrez peut-être contourner ou invalider manuellement le fichier de vidage.

Pour passer à l'aide du fichier de vidage, utilisez compinit -D; Cela n'affectera que la coque actuelle.

Pour reconstruire le fichier de vidage, supprimez-le et revenir sur compinit:

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

Cela affectera la coque actuelle, des coquilles existantes qui exécutent de la plaine compinit et de futures coquilles.

13
Chris Johnsen

J'ai constaté que lorsque vous traitez avec/développer des acheminements qui vivent dans un fichier avec un #compdef _foo foo que je dois utiliser à chaque modification:

unfunction _foo && compinit

afin de voir la commande mise à jour foo complétant avec les modifications mises à jour.

0
Micah Elliott