Zsh auto complete suggère des fonctions complètes (_git _vim etc.)

9

J'ai un petit désagrément avec la façon dont zshfait des suggestions complètes pour mes commandes.

Si je tape le début d'une commande que je n'ai pas installée et que j'appuie, tabelle suggérera la fonction d'achèvement qui est installée.

Disons que je veux exécuter, vimmais il n'est pas installé, il suggérera _vim.

Y a-t-il un moyen de désactiver cela? Ou ai-je fait quelque chose de mal dans ma configuration?

Tous mes fichiers dot sont publics sur github.com/henrikbjorn/castle.

Henrik Bjørnskov
la source
J'ai déjà vu ce comportement, mais dans ma configuration actuelle, il ne semble pas être présent. Malheureusement, je n'ai aucune idée, lequel de mes paramètres a changé ce comportement.
Customizer

Réponses:

8

Par défaut, le moteur de complétion de zsh essaie seulement d'ajouter quelque chose à ce que vous tapez. Vous l'avez configuré pour essayer également d'ajouter un préfixe. Le moteur de configuration de complétion interactive simple ( compinstall) offre ceci sous "contrôle de correspondance → complétion de sous-chaîne". Cela insère une ligne comme celle-ci dans votre .zshrc:

zstyle ':completion:*' matcher-list '' 'l:|=* r:|=*'

Les zstyleparamètres intégrés définissent (principalement) les paramètres d'achèvement. Le matcher-liststyle d'achèvement est une liste de façons d'essayer successivement, s'arrêtant lorsqu'il y a au moins une correspondance. La chaîne vide signifie l'achèvement par défaut (suffixes uniquement). L' incantation de contrôle de correspondancel:|=* r:|=* signifie essayer une correspondance de préfixe *et une correspondance de suffixe *, c'est-à-dire n'importe quel préfixe et suffixe.

Vous pouvez interdire _complètement les préfixes commençant par . Cela permet toujours l'achèvement des mots commençant par _et l'achèvement en ajoutant un préfixe, mais le préfixe peut ne pas commencer par _.

zstyle ':completion:*' matcher-list '' 'l:|=[^_]* r:|=*'

Cela s'applique à toutes les finitions, pas seulement aux finitions de noms de commandes. Je ne sais pas comment restreindre cela aux noms de commandes.

Il devrait y avoir un moyen d'exclure plus précisément les noms de commande commençant par _, mais je ne sais pas comment. Un premier départ est avec le ignored-patternsstyle d'achèvement.

zstyle ':completion:*:*:-command-:*:*' ignored-patterns '_*'       

Cela exclut les correspondances commençant par _; cependant, s'il n'y a pas de correspondance, zsh réessaye sans ignorer les règles. L'avantage de cela est que si la commande a commencé avec un trait de soulignement en premier lieu, elle sera terminée lors de cette deuxième passe. La mauvaise partie est que zsh essaiera donc d'ajouter un trait de soulignement de toute façon s'il n'y a pas de correspondance, donc si vous avez viet viewmais pas en vimappuyant sur Tabaprès vi, vous proposerez viet viewmais pas _vim, mais si vous tapez, la vimcomplétion sera proposée _vim.

Gilles 'SO- arrête d'être méchant'
la source
Merci semble fonctionner en faisant l'une des solutions que vous avez spécifiées, j'ai également appris un tas sur la façon dont cela fonctionne.
Henrik Bjørnskov
2
La solution avec ignore-patternsfonctionne très bien pour moi, même s'il n'y a pas de correspondance. Je devais juste m'assurer que completerça ne contient pas _ignored.
Adaephon