Ich habe eine zsh-Autovervollständigungsfunktion für einen Befehl namens, gd
die 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 hw
es 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, _gd
die 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 _gd
einfach 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=Z
sucht nach allen nicht überlappenden Teilzeichenfolgen, die dem Muster entsprechenXY
, und macht den Teil, der mitX
Auchstimmt mit allem überein, was dem Muster entspricht,Z
wenn nach übereinstimmenden Vervollständigungen gesucht wird.?
entspricht einem beliebigen Zeichen.- Wenn
X
oderY
gleich ist*
, stimmt es mit einer beliebigen Anzahl aufeinanderfolgender Zeichen überein. - Wenn
Z
gleich*
, stimmt es mit einer beliebigen Anzahl aufeinanderfolgender Zeichen übereinaußeralles, was mit übereinstimmtY
. - Wenn
Z
es gleich ist**
, stimmt es mit einer beliebigen Anzahl aufeinanderfolgender Zeichen überein. - In
r:|?=**
istX
gleich 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.