1.引数として事前定義されたディレクトリ。
の引数が何であるかを事前に知っている場合は、mycmd
内部に値がハードコーディングされた非常に単純な補完関数を使用できます。
#compdef _mycmd
_arguments "1: :(foo bar baz baz/and/some/subdir)"
これにより、以下が得られます。
zsh% mycmd<TAB>
bar baz baz/some/other/subdir foo
zsh% mycmd baz<TAB>
baz baz/some/other/subdir
zsh% mycmd baz/<TAB>
zsh% mycmd baz/some/other/subdir
2. ディレクトリ内のすべてのサブディレクトリへの完了
foo
のサブディレクトリが の有効なパスであると仮定するとmycmd
:
~/foo/bar # Valid path
~/foo/subdir/baz # Valid path
~/baz/bar # Invalid path
への引数としてcompctl
内の任意のディレクトリを完了するように指示できます。foo
mycmd
# In your ~/.zshrc
compctl -/ -W ~/foo mycmd
これがあなたが書いた他の補完関数とどれだけうまく機能するかわかりませんmycmd
(たとえば、mycmd
ファイル名以外の引数も取る場合)。次のように完了します。
zsh% mycmd<TAB>
bar/ baz/ caz/
zsh% mycmd baz/s<TAB>
zsh% mycmd baz/subdir/
注: パス / コマンドが少し長くなりました。以下のペーストの一部を切り取りました ( に置き換えました...
)。
3. 定義済み配列の使用。
配列d=(foo bar baz)
があり、各要素が の有効な補完である場合mycmd
、次を使用できます-k
。
→ compctl -k "(foo bar baz)" mycmd
→ mycmd
bar baz foo
4. 配列のサブディレクトリ。
次のディレクトリ構造を使用します。
~/.../somedir
~/.../somedir/bar
~/.../somedir/foo
~/.../somedir/foo/invalid
~/.../otherdir
~/.../otherdir/subdir
~/.../otherdir/subdir/baz
の-W
オプションcompctl
も引数として配列を取り、これを可能にします:
→ compctl -/ -W "(/.../otherdir /.../somedir)" mycmd
→ mycmd <TAB>
bar/ foo/ subdir/
これはあなたが望むものと一致すると確信しています。
注:この-W
オプションは-/
( のマニュアル ページを参照zshcompctl
) で動作します --W
単独では動作しません。
5. 部分的なサブディレクトリを持つ配列
有効な引数が次のとおりであると仮定しましょう。
mycmd foo # Valid
mycmd baz # Valid
mycmd baz/and/some/subdir # Valid - subdirectory of `baz`
mycmd foo/subdir # Invalid!!
のサブディレクトリは必要ありません。これは、とを混合することで実現できます。foo
baz
-k
-/ -W
→ compctl -/ -W "(/.../otherdir)" -k "(/.../somedir/foo)" mycmd
→ mycmd <TAB>
/Users/simont/sandbox/completion/somedir/foo subdir/
→ mycmd foo/<TAB> # No further completion - we can't complete foo/invalid.
→ mycmd subdir/<TAB>
→ mycmd subdir/baz/
ただし、これは完全なパスを残します(それを削除するfoo
とは異なります)。-W
これを修正するには、 の配列に入れないでください-k
:
compctl -/ -W "(/.../otherdir)" -k "(foo)" mycmd