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樣式被忽略,這是此方法的一個小缺點。可能有更好的方法。

相關內容