在第3个参数的zsh中自动完成

时间:2012-04-17 15:48:55

标签: autocomplete zsh

我有一个shell脚本,它的用法是:

foo.sh <name> <type> <*.tar.gz>

我想仅在第3个参数上设置完整版。 如果按第一个参数,只显示用法。

我可以使用zsh的zshcomp来完成这项工作吗?

例如:

foo.sh <tab>  # display usage
foo.sh a b <tab> # show files match with *.tar.gz

我可以遵循类似的脚本吗?

1 个答案:

答案 0 :(得分:6)

要阅读的内容。

这是一篇讨论Z-Shell Completion System的博客文章。

要进行更深入的讨论,请阅读this unix.stackexchange回答。

并且一如既往地read the man pages!

修改:忘记添加:echo $fpath会显示zsh使用的功能路径。在OSX上,我有:/usr/local/share/zsh/4.3.17/functions,(位置可能因您而异),其中包含所有ZSH完成功能。看看_ssh_ls_tar等等 - 它们都在那里,而且它们都有很多可以从中学习的漂亮功能。


解决问题:你应该去的方向。

但你所要求的是可以实现的。有几个步骤。

  1. 您需要编写z-shell完成函数。它需要位于fpath; zsh用于完成系统功能的函数路径。 (如果它是一个小函数,将它放入~/.zshrc也可以,但不推荐)。

  2. 您希望在第3个参数上完成。为此,您的函数将如下所示:

    _arguments "3:<MENU>:<COMPLETION>"
    

    <MENU>菜单说明,如果您启用了菜单说明,则会看到该说明。 (这是使用zstyle完成的;阅读手册页或链接页面以获取更多信息)。 <COMPLETION>是您可以完成的事情。例如,如果您使用:

    _arguments "3::(Foo Bar)"
    

    当您运行脚本并按<TAB>时,您可以选择FooBar。 [注意:该示例中没有<MENU>。如果您不想要菜单描述符,可以省略它,如图所示]。

  3. 您希望完成*.tar个文件。您可以致电_files来执行此操作:

    _files -g \*.tar
    
  4. 显示第一个参数的用法:这是一个没有参数的完成(即参数1)。我不确定为什么你只想要完成第三个选项而不是前两个(典型用法说明),所以我不知道如何回答这个问题。如果您的脚本应该像这样使用:script foo bar FILE.tar,您是否也想要完成foobar参数? 也许更好的解决方案是在没有参数的情况下运行脚本时显示用法。

  5. 完整脚本看起来如下所示:

    
    #compdef myscript
    
    _arguments "3:tar files:_files -g \*.tar"