zsh 中具有固定深度的完整目录名称

zsh 中具有固定深度的完整目录名称

我正在编写一个完成函数,在某些时候我用_files -W $somevar -/它来完成$somevar.为了简单起见,我们假设它是,$HOME/.local/lib并且我在那里有不同 python 版本的子目录,并且实际上想要完成我有一个$HOME/.local/lib/目录的 python 版本:

_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>建议 is nowpython3.5/python3.6/通过制表符补全插入尾部斜杠,一旦我选择了一个版本,补全就会进一步建议python3.5/site-package。这是正确的行为,因为这些实际上是现有的目录。对于我的用例,我不想进入目录三,而只想直接在 $HOME/.local/lib 中完成目录。有没有一种简单的方法可以完成目录,而无需使用内置完成功能完成目录?或者我应该使用全局表达式$HOME/.local/lib/*(/)并去掉我不想要的部分?

答案1

_files -W $HOME/.local/lib -/ -S "" -F "*/*"做的工作:-S ""抑制添加后缀/,并_F "*/*"排除子目录(通过_path_filescompadd))。

-F导致ignored-patterns样式被忽略,这是此方法的一个小缺点。可能有更好的方法。

相关内容