我正在編寫一個完成函數,在某些時候我用_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
樣式被忽略,這是此方法的一個小缺點。可能有更好的方法。