Wie kann ich das Vervollständigungssystem von zsh optimieren, um unter bestimmten Umständen "gefälschte" Dateien zu vervollständigen?
Genauer gesagt, das AVFS- Dateisystem macht Archive als Verzeichnisse verfügbar, indem neben jedem Archiv ein „falsches Verzeichnis“ erstellt wird. Standardmäßig wird die gesamte Verzeichnishierarchie unter ihrem Bereitstellungspunkt repliziert ~/.avfs
. Außerdem gibt es unter ~/.avfs
für jede Archivdatei, z. B. /tmp/foo.zip
neben der Archivdatei selbst ~/.avfs/tmp/foo.zip
, ein Verzeichnis, ~/.avfs/tmp/foo.zip#
das den Inhalt des Archivs anzeigt. Dieses zusätzliche Verzeichnis erscheint jedoch nicht in der Liste von ~/.avfs/tmp
: es existiert nur auf ausdrücklichen Wunsch. (Dies ähnelt der Funktionsweise einiger Automounters.)
mountavfs
cd ~/.avfs/tmp/foo.zip\#
Wenn ich einen Befehl wie oben eingebe, foo.zip#
wird er nicht als Vervollständigung angezeigt ~/.avfs/tmp/
, da es kein solches Verzeichnis gibt. Wie kann ich zsh mitteilen, dass immer, wenn es eine Datei gibt, deren vollständiger Pfad $arc
mit ~/.avfs/**/*.(tgz|zip)
¹ übereinstimmt , so getan werden sollte, als gäbe es ein Verzeichnis mit dem Namen ${arc}#
?
(Beachten Sie, dass die Vervollständigung bei jedem Aufruf von _files
oder funktionieren soll _dirs
, nicht nur für den cd
Befehl. _files
Wenn möglich, möchte ich nicht den Code der Funktion duplizieren müssen .)
¹ und alle anderen Erweiterungen
quelle
/path/to/foo
ist sichtbar als~/.avfs/path/to/foo
.avfs
. Wenn der Standardverzeichniseintrag#
für alle Dateien angezeigt wird , die mit den von ihm unterstützten Zeichenfolgen übereinstimmen, oder die Dateien in einem Verzeichnis von Magic auf die erforderlichen Einträge geprüft werden#
, funktioniert die Vervollständigung einfach. Ich denke, es würde einen Performance-Hit für so etwas geben,find
da es jetzt komprimierte Dateien durchwühlen würde.Antworten:
Eine gefälschte Antwort scheint für diese gefälschte Frage unzureichend zu sein. Die in zsh integrierte Unterstützung für Automount-Verzeichnisse gilt für Verzeichnisse (
fake-files dir:names
) und nicht für darin enthaltene Dateimuster . Dies ist praktisch, um einem Verzeichnis bestimmte benannte Dateien hinzuzufügen, die fürautomount
odersshfs
NetApp-.snapshot
Setups geeignet sind, bei denen das anzuhängende Verzeichnis ein bekannter statischer Name istALAS
.zshall(1)
sagt, dass die "Namen" Zeichenfolgen sind und Experimente zeigen, dass Metazeichen (z. B.#
oder\#
oder'*(e:"echo hi":)'
) auf verschiedene Weise "nicht funktionieren", so dass ich keine Möglichkeit kenne, einen Glob auf den Namensteil derfake-files
Anweisung zu schleichen . (DurchblätternSrc/Zle/computil.c
könnte genau zeigen, was die Namen sein können, aber das wäre mehr Arbeit.) (Auch die Verwendung von rekursiven Globs in der Verzeichnisposition zum Benennen von Archivdateien hat nicht geflogen, aber es wird wiederum C-Tauchen erfordern, um zu sehen, wie vielfake-files
Lässt du kommst davon mit.)Mit
compdef
kann man die.avfs
Verzeichnisvervollständigungen auflisten:Dies schlägt jedoch fehl, da die
#
Dateien nur angezeigt werden, wenn es keine Rolle spielt und sie daher nicht vervollständigen können. (Es gibt produktive Verwendungen für dieses Formular, jedoch nicht für diesen Fall.)Mit kommen
zstyle
Sie näher.zshrc
:Es kann jedoch nur bis zum
\#/
Bit abgeschlossen werden (auf einem Debian-Squeeze-Virt mit einem Standard-AVFS-Setup), nicht jedoch in das virtuelle Dateisystem für ein Archiv, sodass zusätzliche Arbeit erforderlich ist, um den Tab-Abschluss in den Archiven vorzunehmen. Ich vermute über_call_program ... ls
oder etwas in dieser Richtung für Vervollständigungen am\#
Stück, es sei denn, es gibt eine elegantere Möglichkeit,zsh
zu glauben, dass Verzeichnisse, die nicht existieren, es tun.Schlechte Nachrichten! Die Fertigstellung schafft es nicht
_path_files
für die gefälschten Verzeichnisse; Ich vermute, das hängt mit zsh globbing zusammen. Sowohl zsh 4.something on als auch zsh 5.0.8 weisen das Problem auf. Ich vermute also, dass für eine vollständige Korrektur Patches für_path_files
diese falschen Verzeichnisse erforderlich sind oder dass Sie etwas anderes schreiben müssen, das ansonsten vollständig ist. Ein Abschluss Debug - Trace kann in durch Eingabe erzeugt wirdls /root/.avfs/root/sometar.gz\#/
und dann diese Typisierung am Ende ,control-x
und dann?
, unter der Annahme ,bindkey -e
und das_complete_debug
ist an dem keycombo gebunden, wenn jemand vertiefen durch will , warum dies versagt.quelle
In zsh können Sie
compctl -K
Ihre eigene Funktion für die Optionen zum Abschluss der Generierung registrieren. Beispielsweise:Dann müssen Sie Ihre eigene Funktion definieren:
Offensichtlich erfordert das oben Genannte etwas mehr Arbeit, aber es ist etwas, mit zu beginnen.
Eine ähnliche (aber andere) benutzerdefinierte Vervollständigungsfunktion kann für die Bash registriert werden.
Hier ist ein Beispiel mit Implementierungen für bash und zsh . (Ermöglicht das Vervollständigen der Befehlszeilenoptionen, indem die Optionen aus der Manpage des Befehls abgerufen werden.)
Und hier sind ein paar schnelle Ratschläge zu Dingen, die in Ihrer Vervollständigungsfunktion funktionieren könnten:
Oder vielleicht das:
Viel Glück!
quelle
compctl
, dh ich möchte ändern, was_files
tut. Ihre Antwort ist überhaupt nicht hilfreich.