gpt4 book ai didi

zsh - 基于多个路径的自定义 zsh 补全

转载 作者:行者123 更新时间:2023-12-05 08:44:16 35 4
gpt4 key购买 nike

我想为接受目录作为参数的命令编写自定义补全。我认为通过示例来解释它应该如何工作是最简单的。

假设我在某处定义了一个目录列表:

d=(~/somedir/foo ~/somedir/foo/bar ~/other/dir/baz)

对命令的有效调用是

mycmd foo
mycmd bar
mycmd baz
mycmd baz/and/some/subdir

完成应该可以做

mycmd f<TAB>              => mycmd foo
mycmd baz/and/some/s<TAB> => mycmd baz/and/some/subdir

不知何故,我有点迷失在 zshcompsys 的复杂性中,所以我不确定如何最好地解决这个问题。

最佳答案

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

compctl-W 选项也接受一个数组作为参数,允许这样做:

→ 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

关于zsh - 基于多个路径的自定义 zsh 补全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14287887/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com