我有一个shell脚本,它的用法是:
foo.sh <name> <type> <*.tar.gz>
我只想设置一个完整的第三个参数。如果我按下第一个参数,只显示用法。
我可以使用 zsh 的 zshcomp 来完成这项工作吗?
例如:
foo.sh <tab> # display usage
foo.sh a b <tab> # show files match with *.tar.gz
我可以遵循类似的脚本吗?
我有一个shell脚本,它的用法是:
foo.sh <name> <type> <*.tar.gz>
我只想设置一个完整的第三个参数。如果我按下第一个参数,只显示用法。
我可以使用 zsh 的 zshcomp 来完成这项工作吗?
例如:
foo.sh <tab> # display usage
foo.sh a b <tab> # show files match with *.tar.gz
我可以遵循类似的脚本吗?
这是一篇讨论Z-Shell 完成系统的博文。
如需更深入的讨论,请阅读此 unix.stackexchange答案。
和往常一样,阅读手册页!.
编辑:忘记添加:echo $fpath将向您显示zsh使用的函数路径。在 OSX 上,我有:/usr/local/share/zsh/4.3.17/functions,(位置可能因您而异),其中包含所有 ZSH 完成功能。看看_ssh,_ls等_tar- 它们都在那里,而且它们都有许多可以学习的漂亮特性。
不过,您要问的是可以实现的。有几个步骤。
您需要编写一个 z-shell 补全函数。它需要位于fpath; zsh用于完成系统功能的功能路径。(如果是小函数,放入~/.zshrc也可以,但不推荐)。
您希望在第三个参数上完成。为此,您的函数将如下所示:
_arguments "3:<MENU>:<COMPLETION>"
<MENU>是菜单描述,如果您启用了菜单描述,您将看到它。(这是使用zstyle; 阅读手册页或链接页面以获取更多信息)。
<COMPLETION>是你可以完成的事情。例如,如果您使用:
_arguments "3::(Foo Bar)"
当您运行脚本并按下<TAB>时,您可以选择Foo或Bar。[注意:<MENU>该示例中没有。如果您不需要菜单描述符,则可以省略它,如图所示]。
您希望完成*.tar文件。你可以打电话_files来做到这一点:
_files -g \*.tar
显示第一个参数的用法:那将是一个没有参数的完成(即参数 1)。我不确定你为什么只希望完成第三个选项而不是前两个(典型的使用说明),所以我不知道如何回答这个问题。如果你的脚本应该像这样使用: script foo bar FILE.tar,你不想完成fooandbar参数吗?
当脚本在没有参数的情况下运行时,也许更好的解决方案是显示使用情况。
完整的脚本如下所示:
#compdef myscript
_arguments "3:tar files:_files -g \*.tar"