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