我有一个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
我可以遵循类似的脚本吗?
答案 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
等等 - 它们都在那里,而且它们都有很多可以从中学习的漂亮功能。
但你所要求的是可以实现的。有几个步骤。
您需要编写z-shell完成函数。它需要位于fpath
; zsh
用于完成系统功能的函数路径。 (如果它是一个小函数,将它放入~/.zshrc
也可以,但不推荐)。
您希望在第3个参数上完成。为此,您的函数将如下所示:
_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
,您是否也想要完成foo
和bar
参数?
也许更好的解决方案是在没有参数的情况下运行脚本时显示用法。
完整脚本看起来如下所示:
#compdef myscript
_arguments "3:tar files:_files -g \*.tar"