%20wird%20bei%20Befehlsnamen%20mit%20Bindestrichen%20nicht%20ausgel%C3%B6st..png)
Ich verwende zsh compctl schon seit Ewigkeiten (Ende der 90er oder Anfang der 00er), aber seltsamerweise bin ich noch nie darauf gestoßen. Als ich heute eine compctl-Konfiguration vornehmen wollte, wurde mir klar, update-alternatives
dass meine Vervollständigungen überhaupt nicht ausgelöst wurden, sondern nur meine standardmäßige Fallback-Vervollständigung (Dateien) verwendet wurde ... also ein sehr abgespecktes, einfaches Beispiel, um das Problem zu veranschaulichen:
Das funktioniert gut:
zshprompt% compctl -k '(arg1 arg2 arg3)' nodash
# typing 'nodash ' and hitting [Tab] once:
zshprompt% nodash arg
# hitting [Tab again]
zshprompt% nodash arg
arg1 arg2 arg3
Aber stattdessen diese vollständigen Dateien:
# just showing the current dir for reference:
zshprompt% ls .
file2.txt myfile1.txt
zshprompt% compctl -k '(arg1 arg2 arg3)' with-dash
# typing 'with-dash ' and hitting [Tab] once:
zshprompt% with-dash
file2.txt myfile1.txt
Wie man sieht, wird die Standardvervollständigung (Auflisten des aktuellen Verzeichnisses) verwendet und nicht die, die ich mit compctl hinzugefügt habe ...
Ich konnte dazu weder auf der Manpage (man zshcompctl) noch online wirklich etwas finden ... hat also bitte jemand eine Idee, wie man compctl dazu bringt, Befehle mit Bindestrichen im Namen abzugleichen?
TIA
Antwort1
Habe es bestätigt in der[email geschützt]Mailingliste, dass dies ein Fehler ist und einen Patch-Vorschlag erhalten hat:
--- zsh-5.9.orig/Src/Zle/zle_tricky.c
+++ zsh-5.9/Src/Zle/zle_tricky.c
@@ -1315,6 +1315,8 @@ get_comp_string(void)
ins = (tok == REPEAT ? 2 : (tok != STRING && tok != TYPESET));
zsfree(cmdstr);
cmdstr = ztrdup(tokstr);
+ untokenize(cmdstr);
+ remnulargs(cmdstr);
cmdtok = tok;
/*
* If everything before is a redirection, or anything
Ich habe es getestet, indem ich die Änderung als Quilt-Patch auf das neu erstellte und installierte Debian-Quellpaket zsh_5.9-4 angewendet habe … und das hat mein Problem gelöst.
Ich werde es jetzt weiter ausführen und wenn es nichts anderes zu beschädigen scheint, werde ich sicherstellen, dass es in zsh upstream angewendet wird, in der Erwartung, dass es schließlich in alle verschiedenen Distributionen durchsickert.
Wenn Sie das Problem jetzt haben und nicht warten können, bis es in Ihrer Distribution auftaucht, laden Sie die zsh 5.9.4-Quelle herunter, patchen Sie sie mit dem obigen Patch und erstellen Sie sie lokal. Wenn Sie es in Ihr Distributionspaket integrieren möchten, gehen Sie wie folgt vor (sollte für die meisten auf Deb-Paketen basierenden Distributionen funktionieren):
sudo apt install devscripts libcap-dev libelf-dev libgdbm-dev cm-super-minimal texinfo yodl quilt
mkdir /tmp/zsh_5.9
cd /tmp/zsh_5.9
apt source zsh=5.9-4
/bin/echo -e "1317a1318,1319\n> \t untokenize(cmdstr);\n> \t remnulargs(cmdstr);" > compctl-dash.diff
cd zsh-5.9
export QUILT_PATCHES=debian/patches
export QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index"
quilt push -a
quilt new compctl-dash.diff
quilt add Src/Zle/zle_tricky.c
patch Src/Zle/zle_tricky.c ../compctl-dash.diff
quilt refresh
quilt pop -a
debuild -b -uc -us
sudo dpkg -i ../zsh_5.9-4_amd64.deb
Hoffentlich wird dies upstream behoben und hat Ihre Distribution erreicht, bevor das Paket das nächste Mal aktualisiert wird, andernfalls müssen Sie es wiederholen (oder die zsh-Paketversion sperren), bis es soweit ist :-)