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/lib
und 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_files
Undcompadd
)).
-F
führt dazu, dass der ignored-patterns
Stil ignoriert wird, was ein kleiner Nachteil dieses Ansatzes ist. Es gibt vielleicht einen besseren Weg.