vollständige Verzeichnisnamen mit fester Tiefe in zsh

vollständige Verzeichnisnamen mit fester Tiefe in zsh

Ich schreibe eine Vervollständigungsfunktion, die ich irgendwann verwende, _files -W $somevar -/um Unterverzeichnisse von zu vervollständigen $somevar. Der Einfachheit halber nehmen wir an, dass es sich um handelt $HOME/.local/libund ich dort Unterverzeichnisse für verschiedene Python-Versionen habe und eigentlich Python-Versionen vervollständigen möchte, für die ich ein Verzeichnis habe $HOME/.local/lib/:

_files -W $HOME/.local/lib -/

und der Verzeichnisbaum sieht ungefähr so ​​aus

.local
├── lib
│   ├── python3.5
│   │   └── site-packages
│   │       ├── somepackage
│   │       ├── somepackage-1.0.1-py2.7.egg-info
│   │       ├── someotherpackage
│   │       └── someotherpackage-1.0.11-py2.7.egg-info
│   ├── python3.6
│   │   └── site-packages
│   │       ├── somepackage
│   │       │   └── __pycache__
│   │       ├── somepackage-0.1-py3.6.egg-info
│   │       ├── someotherpackage
│   │       │   └── __pycache__
│   │       ├── someotherpackage-2018.4.16.dist-info
...

Wenn ich die obige Vervollständigung verwende, werden mycommand <TAB>die Vorschläge jetzt mit dem abschließenden Schrägstrich angezeigt, der durch die Tabulatorvervollständigung eingefügt wird, und sobald ich eine Version ausgewählt habe, schlägt die Vervollständigung weiter vor . Dies ist insofern ein korrektes Verhalten, als es sich um tatsächlich vorhandene Verzeichnisse handelt. Für meinen Anwendungsfall möchte ich nicht in das dritte Verzeichnis gehen, sondern nur Verzeichnisse direkt in $HOME/.local/lib vervollständigen. Gibt es eine einfache Möglichkeit, Verzeichnisse zu vervollständigen, ohne sie mit integrierten Vervollständigungsfunktionen zu vervollständigen? Oder sollte ich Glob-Ausdrücke verwenden und die Teile entfernen, die ich nicht möchte?python3.5/python3.6/python3.5/site-package$HOME/.local/lib/*(/)

Antwort1

_files -W $HOME/.local/lib -/ -S "" -F "*/*"erledigt die Aufgabe: -S ""das Hinzufügen eines Suffixes zu unterdrücken /und _F "*/*"Unterverzeichnisse auszuschließen (über_path_filesUndcompadd)).

-Fführt dazu, dass der ignored-patternsStil ignoriert wird, was ein kleiner Nachteil dieses Ansatzes ist. Es gibt vielleicht einen besseren Weg.

verwandte Informationen