自定义脚本的 ZSH 自动完成

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”时,它会显示我配置的选项: TAB 时显示的所有选项

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

单词之间有空格的选项“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)

但选项尚未嵌套: 选项未嵌套

我非常感谢任何关于如何改进我的脚本的帮助或见解(或者将其扔掉并用适当的东西替换它)。

Tom*_*ner 0

迟到总比不到好。

按照此处找到的一些示例: 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)