私は補完関数を書いていますが、ある時点で を使用して_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/
タブ補完によって末尾のスラッシュが挿入され、バージョンを 1 つ選択すると、補完によってさらに が提案されますpython3.5/site-package
。これらは実際に存在するディレクトリであるため、これは正しい動作です。私のユースケースでは、ディレクトリ 3 を下るのではなく、$HOME/.local/lib 内のディレクトリのみを直接補完します。組み込みの補完機能を使用して、ディレクトリを補完せずに簡単に補完する方法はありますか? または、glob 式を使用して不要な$HOME/.local/lib/*(/)
部分を削除する必要がありますか?
答え1
_files -W $HOME/.local/lib -/ -S "" -F "*/*"
は、-S ""
サフィックスの追加を抑制し/
、_F "*/*"
サブディレクトリを除外します(_path_files
そしてcompadd
))。
-F
スタイルが無視されてしまうためignored-patterns
、このアプローチには小さな欠点があります。もっと良い方法があるかもしれません。