我正在编写一个完成函数,在某些时候我用_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_files
和compadd
))。
-F
导致ignored-patterns
样式被忽略,这是此方法的一个小缺点。可能有更好的方法。