Pau*_*ane 16 zsh zsh-completion
我编写了一个使用子命令的命令行工具,就像Mercurial,Git,Subversion&c.一样,它的一般用法是:
>myapp [OPTS] SUBCOMMAND [SUBCOMMAND-OPTS] [ARGS]
Run Code Online (Sandbox Code Playgroud)
例如
>myapp --verbose speak --voice=samantha --quickly "hello there"
Run Code Online (Sandbox Code Playgroud)
我现在正在为它建立Zsh完成,但很快发现它是一个非常复杂的野兽.我已经看过了_hg和_git完成但是它们非常复杂并且在方法上有所不同(我很难理解它们),但两者似乎分别处理每个子命令.
有谁知道,如果有使用内置函数的方式(_arguments,_values,pick_variant&C)正确处理子命令的概念,包括妥善处理常规选项和子命令特定的选项?或者最好的方法是手动处理一般选项和子命令?
一个非常好的例子将非常感激.
非常感谢.
Mar*_*o F 24
你是对的,因为zsh的编写完成脚本可能非常困难.您最好的选择是使用现有的作为指导.对于初学者来说,git对于初学者来说太过分了.你可以使用这个回购:
https://github.com/zsh-users/zsh-completions
至于你的问题,你已经使用了国家的概念.您可以在列表中定义子命令,然后通过$ state识别您所在的命令.然后为每个命令定义选项.您可以在完成剧本看到这个戏.简化版如下:
_play() {
local ret=1
_arguments -C \
'1: :_play_cmds' \
'*::arg:->args' \
&& ret=0
case $state in
(args)
case $line[1] in
(build-module|list-modules|lm|check|id)
_message 'no more arguments' && ret=0
;;
(dependencies|deps)
_arguments \
'1:: :_play_apps' \
'(--debug)--debug[Debug mode (even more informations logged than in verbose mode)]' \
'(--jpda)--jpda[Listen for JPDA connection. The process will suspended until a client is plugged to the JPDA port.]' \
'(--sync)--sync[Keep lib/ and modules/ directory synced. Delete unknow dependencies.]' \
'(--verbose)--verbose[Verbose Mode]' \
&& ret=0
;;
esac
esac
Run Code Online (Sandbox Code Playgroud)
(如果要粘贴它,请使用原始源,因为这不起作用).
它看起来令人生畏,但总体思路并不复杂.子命令首先出现(_play_cmds是一个子命令列表,每个子命令都有一个描述),然后是参数.参数是根据您选择的子命令构建的.请注意,如果它们共享参数,则可以对多个子命令进行分组.
与男人zshcompsys你可以找到有关整个系统的更多信息,虽然它有点密集.
| 归档时间: |
|
| 查看次数: |
3048 次 |
| 最近记录: |