我有一个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
,你不想完成foo
andbar
参数吗?
当脚本在没有参数的情况下运行时,也许更好的解决方案是显示使用情况。
完整的脚本如下所示:
#compdef myscript
_arguments "3:tar files:_files -g \*.tar"