我正在为swift工具(编译器和包管理器)编写zsh完成脚本。此命令可以在指定或不指定子命令的情况下使用。例如
# calls to the compiler
# usage: swift [options] <inputs>
1> swift my_file.swift
2> swift -a 1 -b 2 my_file.swift
# calls to build subcommand
3> swift build
4> swift build -c 1
# calls to test subcommand
5> swift test
6> swift test -d 4
到目前为止,我已经获得了以下完成脚本。它主要是有效的,但是对于裸机,自动完成功能并不是很好。它确实输入了_compiler方法,但在swift -a
之后它没有正确自动完成。它自动填充就像忘记了-a
一样。所以swift -a <TAB><TAB>
应该显示选择1-2-3的菜单;但它显示了一个文件列表。对于swift -a -a <TAB><TAB>
,它会显示正确的完成次数,但重复-a
无效。
它可能与被改变的状态有关,而对于这个特定的用例不应该有。但是对于子命令(build&amp; test),应该更改状态以使其各自的完成正常工作。
我已经完成了文档,但它非常神秘。我已经检查过各种其他完成脚本,但无法找出丢失的链接。那么如何为具有可选子命令的命令指定一个完成,这些子命令具有单独的标志集(并且本身也有子子命令)?
#compdef swift
local context state state_descr line
typeset -A opt_args
_swift() {
_arguments -C \
': :->command' \
'*:: :->arg'
case $state in
(command)
local tools
tools=(
'build:description for build'
'test:description for test'
)
_alternative \
'tools:common:{_describe "tool" tools }' \
'compiler: :_compiler'
;;
(arg)
case ${words[1]} in
(build)
_build
;;
(test)
_test
;;
(*)
_compiler
;;
esac
;;
esac
}
_compiler() {
_arguments -C \
'(-a)-a[description for a]: :(1 2 3)' \
'(-b)-b[description for b]: :(4 5 6)' \
'*: :_files'
}
_build() {
_arguments -C \
'-c[description for c]: :(1 2 3)'
}
_test() {
_arguments -C \
'-d[description for d]: :(4 5 6)'
}
答案 0 :(得分:0)
您可以使用_regex_words
和_regex_arguments
:
local -a abopts buildopts testopts cmds aargs bargs cargs dargs
local matchany=/$'[^\0]##\0'/
aargs=(/$'(1|2|3)\0'/ ':number:number:(1 2 3)')
bargs=(/$'(4|5|6)\0'/ ':number:number:(4 5 6)')
cargs=(/$'(1|2|3)\0'/ ':number:number:(1 2 3)')
dargs=(/$'(4|5|6)\0'/ ':number:number:(4 5 6)')
_regex_words opt 'options' '-a:description for a:$aargs' '-b:description for b:$bargs'
abopts=("${reply[@]}")
_regex_words opt 'options' '-c:description for c:$cargs'
buildopts=("${reply[@]}")
_regex_words opt 'options' '-d:description for d:$dargs'
testopts=("${reply[@]}")
_regex_words cmd 'commands' 'build:build command:$buildopts' 'test:test command:$testopts'
cmds=("${reply[@]}")
_regex_arguments _swift "$matchany" \( "${cmds[@]}" \| "${abopts[@]}" "$matchany" ":file:file:{_files}" \)
_swift "$@"
您可以在此处了解如何使用这些功能:http://zsh.sourceforge.net/Doc/Release/Completion-System.html#Completion-Functions 或者在这里:https://github.com/vapniks/zsh-completions/blob/master/zsh-completions-howto.org