Zsh Auto Complete schlägt vollständige Funktionen vor (_git _vim usw.)

9

Ich ärgere mich ein wenig darüber, wie zshvollständige Vorschläge für meine Befehle gemacht werden.

Wenn ich den Anfang eines Befehls eingebe, den ich nicht installiert habe, und drücke tab, wird die installierte Abschlussfunktion vorgeschlagen.

Nehmen wir an, ich möchte ausführen, vimaber es ist nicht installiert _vim.

Gibt es eine Möglichkeit, dies auszuschalten? Oder habe ich in meinem Setup etwas falsch gemacht?

Alle meine Dotfiles sind öffentlich bei github.com/henrikbjorn/castle.

Henrik Bjørnskov
quelle
Ich habe dieses Verhalten schon einmal gesehen, aber in meinem aktuellen Setup scheint es nicht vorhanden zu sein. Leider habe ich keine Ahnung, welche meiner Einstellungen dieses Verhalten geändert haben.
Customizer

Antworten:

8

Standardmäßig versucht die Abschluss-Engine von zsh nur, etwas an Ihre Eingabe anzuhängen. Sie haben es so konfiguriert, dass auch versucht wird, ein Präfix hinzuzufügen. Die einfache Interactive Completion Configuration Engine ( compinstall) bietet dies unter „Matching Control → Teilstring Completion“ an. Dies fügt eine Zeile wie diese in Ihre ein .zshrc:

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

Die zstyleeingebauten Einstellungen (meistens) für die Fertigstellung. Der matcher-listAbschlussstil ist eine Liste von Möglichkeiten, nacheinander zu versuchen, anzuhalten, wenn mindestens eine Übereinstimmung vorliegt. Die leere Zeichenfolge bedeutet die Standardvervollständigung (nur Suffixe). Die Beschwörung der Übereinstimmungssteuerungl:|=* r:|=* bedeutet, eine Präfixübereinstimmung *und eine Suffixübereinstimmung zu versuchen *, dh ein beliebiges Präfix und Suffix.

Sie können Präfixe verbieten, die _insgesamt beginnen . Dies ermöglicht weiterhin die Vervollständigung von Wörtern, die mit beginnen _, und die Vervollständigung durch Hinzufügen eines Präfixes, aber das Präfix beginnt möglicherweise nicht mit _.

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

Dies gilt für alle Vervollständigungen, nicht nur für Vervollständigungen von Befehlsnamen. Ich weiß nicht, wie ich das auf Befehlsnamen beschränken soll.

Es sollte eine Möglichkeit geben, Befehlsnamen, die mit beginnen _, genauer auszuschließen , aber ich weiß nicht wie. Ein erster Start ist mit dem ignored-patternsAbschlussstil.

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

Dies schließt Übereinstimmungen aus, die mit beginnen _. Wenn jedoch keine Übereinstimmungen vorhanden sind, versucht zsh es erneut ohne die Ignorierregeln. Das Gute daran ist, dass der Befehl, wenn er zuerst mit einem Unterstrich gestartet wurde, in diesem zweiten Durchgang abgeschlossen wird. Das Schlimme ist , dass zsh also versuchen , einen Unterstrich trotzdem hinzufügen , wenn es keine Übereinstimmungen gibt, also , wenn Sie viund , viewaber nicht vimdrücken Sie dann Tabnach vibieten viund viewdoch nicht _vim, aber wenn Sie geben vimdann Abschluss bieten _vim.

Gilles 'SO - hör auf böse zu sein'
quelle
Dank scheint zu funktionieren, indem Sie eine der von Ihnen angegebenen Lösungen ausführen. Außerdem habe ich einiges über die Funktionsweise gelernt.
Henrik Bjørnskov
2
Die Lösung mit ignore-patternsfunktioniert gut für mich, auch wenn es keine Übereinstimmungen gibt. Musste nur sicherstellen, dass completerdas nicht enthält _ignored.
Adaephon