So stellen Sie Autovervollständigungsvorschläge bereit, deren Präfix in der ZSH-Vervollständigung nicht übereinstimmt

So stellen Sie Autovervollständigungsvorschläge bereit, deren Präfix in der ZSH-Vervollständigung nicht übereinstimmt

Ich habe eine zsh-Autovervollständigungsfunktion für einen Befehl namens, gddie eine Fuzzy-Suche basierend auf dem $words[CURRENT]Wert durchführt und Vorschläge zurückgibt. Die Suche funktioniert einwandfrei, aber zsh zeigt keine Kandidaten an, da der eingegebene Text kein Präfix des Vorschlags ist.

z.B

% gd hw

Könnte die Vervollständigung erzeugenoh hello there, world

Aber zsh zeigt das nicht an, weil hwes am Anfang des Vorschlags nicht gefunden wird.

Kann ich zsh so veranlassen, den Vorschlag als etwas anzubieten, das das aktuelle Wort ersetzt, wenn es ausgewählt wird?

Hier ist eine vereinfachte Version meines Vervollständigungsskripts in einer Datei namens, _gddie sich in meinem befindet fpath:

#compdef gd

_gd() {
  local -a list

  clue="$words[CURRENT]"

      pattern=""
      for i in $(seq $#clue)
      do
        pattern="$pattern.*${clue[i]}"
      done
      while read dir
      do
        list=( $list $dir )
      done <<<$(grep "$pattern" ~/.recent-dirs)

  _describe gd list
}

Antwort1

Entfernen Sie diese Funktion und fügen Sie Ihrer Datei _gdeinfach Folgendes hinzu :.zshrc

autoload -Uz compinit
compinit
zstyle ':completion:*' matcher-list 'r:|?=**'

Dies weist den Vervollständigungscode an, eine beliebige Anzahl zusätzlicher Einträge zwischen und um die von Ihnen eingegebenen Einträge herum zuzulassen. Damit kann Zsh nun Fuzzy-Vervollständigungen durchführen.irgendetwas.

  • r:X|Y=Zsucht nach allen nicht überlappenden Teilzeichenfolgen, die dem Muster entsprechen XY, und macht den Teil, der mitX Auchstimmt mit allem überein, was dem Muster entspricht, Zwenn nach übereinstimmenden Vervollständigungen gesucht wird.
  • ?entspricht einem beliebigen Zeichen.
  • Wenn Xoder Ygleich ist *, stimmt es mit einer beliebigen Anzahl aufeinanderfolgender Zeichen überein.
  • Wenn Zgleich *, stimmt es mit einer beliebigen Anzahl aufeinanderfolgender Zeichen übereinaußeralles, was mit übereinstimmt Y.
  • Wenn Zes gleich ist **, stimmt es mit einer beliebigen Anzahl aufeinanderfolgender Zeichen überein.
  • In r:|?=**ist Xgleich der leeren Zeichenfolge.
  • Standardmäßig fügt Zsh bereits ein Platzhalterzeichen am Ende Ihrer Eingabe hinzu und schließt so den Kreis für ein vollständiges Fuzzy-Matching.

Die Dokumentation finden Sie hier:http://zsh.sourceforge.net/Doc/Release/Completion-Widgets.html#Completion-Matching-Control

Antwort2

Dies ist ein Hack, während ich auf klügere Antworten warte ...

Ich habe meinen Vorschlagsgenerator so eingestellt, dass er Vorschläge wie die folgenden erstellt:

hw»oh hello there, world

Da der Befehl (eigentlich eine Funktion) in meiner Hand liegt, entferne ich einfach den ganzen Müll am Anfang:

input="${input#*»}"

Aber es wäre schön zu wissen, wie man es richtig macht.

verwandte Informationen