Moo*_*oon 8 terminal zsh zsh-completion oh-my-zsh
我已经在网上搜索了很多小时,通宵达旦,因为我在这个兔子洞中迷失了:D,但我很难找到工作代码的示例。
我有一个 bash 脚本,其调用方式如下例所示:
foo-tools.sh switch <version number>
foo-tools.sh start
foo-tools.sh open-ports on
foo-tools.sh kube get logs
foo-tools.sh kube edit ing default-ingress -oyaml
Run Code Online (Sandbox Code Playgroud)
我使用 zsh 和 oh-my-zsh 作为我的 shell。
我希望能够输入“foo-tools.sh”来列出所有可用选项,并且我希望能够使用“foo-tools.sh k”自动完成选项,这意味着它应该列出以“foo”开头的所有可用选项-tools.sh k*" 或者如果只有一个选项自动完成命令。
我在一些 stackoverflow 线程上找到了这段代码,这是我让它完全工作的结束:
#compdef foo-tools.sh
_foo_tools_sh() {
typeset -A opt_args
local alternatives
alternatives=(
'args:rv options:_foo_tools_sh_options'
)
_alternative $alternatives && return 0
return 1
}
_foo_tools_sh_options() {
local -a arguments=(
'start:Start VP'
'stop:Stop VP]'
'kube:Kube CMD'
'kube logs:Kube logs'
'info:Display info'
'get:Get CMD'
)
_sequence _describe 'cmds' arguments
return 1
}
# invoke the completion command during autoload
_foo_tools_sh "$@"
Run Code Online (Sandbox Code Playgroud)
这有点作用。当我输入“foo-tools.sh”时,它会显示我配置的选项:

但是当我使用选项卡自动完成其中一个选项时,它会在命令后面添加一个 , :

单词之间有空格的选项“kube log”在按 Tab 键切换时会转义空格:
我还找到了这两个命令,它们位于我的 .zshrc 中。扩展很奇怪,它忽略了其中有空格的命令,并且不理解命令是嵌套的。即,如果输入 foo-tools.sh open-ports 它会显示所有选项,而不仅仅是关闭/打开。
local -a _foo_tools_sh=(
"start"
"stop"
"switch"
"install"
"kube"
"kube get"
"kube edit"
"open-ports on"
"open-ports off"
)
complete -W "${_foo_tools_sh}" 'foo-tools.sh'
Run Code Online (Sandbox Code Playgroud)
但选项尚未嵌套:

我非常感谢任何关于如何改进我的脚本的帮助或见解(或者将其扔掉并用适当的东西替换它)。
迟到总比不到好。
按照此处找到的一些示例: https: //github.com/zsh-users/zsh-completions/blob/master/src/,我设法拼凑了一个按预期运行的完成脚本。
#compdef foo-tools
_foo_tools() {
local curcontext="$curcontext" state line
_arguments -C ":command:->command" "*::options:->options"
case $state in
(command)
local -a subcommands=(
"start:Start VP"
"stop:Stop VP"
"kube:Kube logs|CMD"
"info:Display info"
"open-port:dis-/enable open-port"
"get:Get CMD"
)
_describe -t commands 'commands' subcommands
;;
(options)
[ $#line -gt 2 ] && return 0 # don't complete multiple options
case $line[1] in
(kube)
local -a ku=(
"logs:Show the logs"
"CMD:whatever"
)
_describe -O 'kube options' ku
;;
(open-port)
local -a op=(
"on:Turn open-ports on"
"off:Turn open-ports off"
)
_describe -O 'open-port options' op
esac
esac
}
Run Code Online (Sandbox Code Playgroud)