полные имена каталогов с фиксированной глубиной в zsh

полные имена каталогов с фиксированной глубиной в zsh

Я пишу функцию завершения, где в какой-то момент я использую _files -W $somevar -/для завершения подкаталогов $somevar. Для простоты вопроса предположим, что это $HOME/.local/libи у меня есть подкаталоги для разных версий python, и на самом деле я хочу завершить версии python, для которых у меня есть каталог $HOME/.local/lib/:

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

и дерево каталогов выглядит примерно так

.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
...

Если я использую приведенное выше дополнение для mycommand <TAB>предложений, которые сейчас python3.5/и python3.6/с завершающим слешем, вставленным с помощью автодополнения Tab, и как только я выбрал одну версию, дополнение далее предлагает python3.5/site-package. Это правильное поведение, поскольку это фактически существующие каталоги. В моем случае использования я не хочу переходить на третий каталог, а только завершать каталоги непосредственно в $HOME/.local/lib. Есть ли простой способ завершить каталоги без завершения в них с помощью встроенных функций завершения? Или мне следует использовать выражения glob $HOME/.local/lib/*(/)и отбрасывать части, которые мне не нужны?

решение1

_files -W $HOME/.local/lib -/ -S "" -F "*/*"выполняет работу: -S ""подавляет добавление суффикса /и _F "*/*"исключает подкаталоги (через_path_filesиcompadd)).

-Fприводит ignored-patternsк игнорированию стиля, что является небольшим недостатком этого подхода. Возможно, есть способ получше.

Связанный контент