Reconstruire l'index de saisie automatique (ou le nom de son choix) et les fichiers binaires dans le cache $ PATH dans zsh

75

Après avoir installé un nouveau logiciel, un terminal déjà ouvert avec zsh ne sera pas informé des nouvelles commandes et ne pourra pas générer de saisie automatique pour celles-ci. Apparemment, l’ouverture d’un nouveau terminal corrige le problème, mais l’index (ou le nom de votre choix) peut-il être reconstruit de sorte que la saisie semi-automatique fonctionne sur l’ancien terminal?

J'ai essayé avec compinitmais ça n'a pas aidé. En outre, existe-t-il un moyen qui ne dépend pas du shell? C'est bien d'avoir un moyen de vérifier la réponse aussi (sauf pour désinstaller quelque chose et le réinstaller).

Ce que je veux dire, c'est après avoir tapé quelques caractères du nom d'une commande, je peux appuyer sur Tabet zshje devrais faire le reste pour extraire le nom complet.

phunehehe
la source
1
Il existe deux types de complétion automatique que vous pourriez vouloir dire quand vous dites qu'un shell existant "ne peut pas générer d'auto-complétion pour [les nouvelles commandes]": "achèvement de la commande" - essaie d'obtenir que le shell suggère le nom de la nouvelle commande lors de l'exécution en position de commande et «achèvement de l’argument» - essaie de faire en sorte que le shell suggère des options / arguments pour la nouvelle commande une fois que vous avez déjà saisi son nom. Qu'est-ce qui vous pose des problèmes?
Chris Johnsen
1
Bonne question! J'avais toujours juste pensé que cela ne pouvait pas être fait, je n'ai pas pensé à vérifier
Michael Mrozek
1
offtopic - les gens sont si inconstants 4 personnes ont été favorisées, mais seulement 2 votes positifs ... Je trouve étrange que peu de gens votent pour les choses.
xenoterracide
@Chris Je veux dire après avoir tapé quelques caractères du nom d'une commande et appuyé sur la touche de tabulation, zsh devrait faire le reste et afficher le nom complet.
Phunehehe
@ xeno j'ai remarqué ça aussi; il est assez inhabituel de préférer quelque chose mais de ne pas le voter
Michael Mrozek

Réponses:

76

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

Assurez-vous de ne pas désactiver l' hash_list_alloption (cela entraîne encore moins d'accès au disque mais rend la mise à jour du cache moins souvent).

Si vous ne voulez pas avoir à taper de 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 aujourd'hui négligeable sur un environnement de bureau typique. (Ce n'est pas le cas si vous avez $PATHsur NFS ou un système dépourvu de RAM.)

La zstylecommande elle-même est documentée dans la zshmodulepage de manuel. Les valeurs de styles sont documentées dans les pages de manuel zshcompsyset zshcompwid, ou vous pouvez lire le source (ici, de la _command_namesfonction). Si vous voulez de la documentation lisible… si vous en trouvez, faites le moi savoir!

¹ nécessite zsh≥4.3.3, merci Chris Johnsen

Gilles, arrête de faire le mal
la source
3
L’une ou l’autre des opérations d’incantation doit permettre l’achèvement du nom de commande de «nouvelles commandes» dans des shells qui étaient auparavant complètement hachés. Paramétrer PATH (ou path) provoquera également un rehash; ainsi PATH="$PATH"ferait aussi le travail. HASH_LIST_ALLest affiché par défaut dans ma documentation.
Chris Johnsen
C'est la réponse pour moi.
BaiJiFeiLong
13

Si vous ne parvenez pas à obtenir la «complétion des arguments» pour les nouvelles commandes, compinit est probablement la commande dont vous avez besoin. Toutefois, il existe un mécanisme de mise en cache qui peut être à l'origine de votre problème.

La documentation de ma version (4.3.10) indique que compinit utilise un "fichier de vidage" mis en cache .zcompdump, pour stocker les fonctions de complétion compilées afin d'accélérer les appels ultérieurs. Il n'invalide le fichier de vidage que lorsqu'il constate une modification du nombre de fichiers d'achèvement ( fpathfichiers d'élément commençant par #compdef …ou #autoload …). L'installation d'un nouveau logiciel modifierait vraisemblablement le nombre de ces fichiers d'achèvement (en supposant que les fichiers auto-complétés zsh soient également installés au bon endroit), je m'attendrais donc à un compinittravail simple . Si vous êtes dans une situation où cela ne fonctionne pas, vous devrez peut-être ignorer ou invalider manuellement le fichier de vidage.

Pour ignorer l’utilisation du fichier de vidage, utilisez compinit -D; cela n'affectera que le shell actuel.

Pour reconstruire le fichier de vidage, supprimez-le et réexécutez compinit:

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

Cela affectera le shell actuel, les shells existants qui fonctionnent en clair compinitet tous les shells futurs.

Chris Johnsen
la source
Certains frameworks zsh comme zimautorisent l'utilisation de fichiers de vidage par hôte. Dans ce cas, supprimez également $zcompdump_fileavec .zcompdump.
Sébastien