动态 Zsh 自动完成

动态 Zsh 自动完成

我正在尝试为自己编写的一些自定义函数编写完成函数,但似乎即使是最基本的函数也很难完成。

示例函数如下:

function eb_instances() {
    if [ "$#" -ne 2 ]; then
        echo "Usage eb_instances <aws profile name> <environment name>"
        echo "e.g.:"
        echo " eb_instances production kraken-prod-api"
        return 1
    fi

    aws ec2 describe-instances --filters  "Name=instance-state-name,Values=running"   "Name=tag:Name,Values=$2" --profile=$1 --output=json | jq -r ".Reservations[].Instances[].PrivateIpAddress"
}

这有两个位置参数,<aws profile name>并且<environment name>

我希望 的完成选项可以<aws profile name>通过运行 动态地提供 sed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' ',并且 的完成可以<environment name>通过运行我调用的另一个函数 动态地提供eb_names

我发现文档非常稀疏,难以理解。我也看过 zsh-completions repo 中类似的命令,但似乎找不到与我需要的类似的命令。

任何帮助都将非常感激!

答案1

我发现 zsh 补全是计算机科学中最难理解的课题之一。在我开始理解它之前,我尝试了很多年,但都失败了。网上提供的帮助并不好。

floop [ --student=<name> ] <directory>对于类似或的命令floop [ -s <name> ] <directory>

#compdef floop

local context state line

_arguments \
  '(--student -s)'{--student=,-s}"[student name to filter on]:student:->students" \
  "*:directory:_files -/"

case $state in
students)
    students=($(echo 'chris pat lynn paige'))
    _describe -t students "a student's name" students && return 0
    ;;
esac

用 zsh 文字数组或为学生选项生成选择的命令替换 echo 命令。

"*:directory:_files -/"行用于目录路径的位置参数。

有办法控制选项是否可以出现多次或始终必须是一个单独的单词(没有“=”)等,但这个例子是一个非常简单的例子。

相关内容