zsh で固定深度の完全なディレクトリ名

zsh で固定深度の完全なディレクトリ名

私は補完関数を書いていますが、ある時点で を使用して_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、このアプローチには小さな欠点があります。もっと良い方法があるかもしれません。

関連情報