Я пишу функцию завершения, где в какой-то момент я использую _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
к игнорированию стиля, что является небольшим недостатком этого подхода. Возможно, есть способ получше.