我正在尝试为自己编写的一些自定义函数编写完成函数,但似乎即使是最基本的函数也很难完成。
示例函数如下:
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 -/"
行用于目录路径的位置参数。
有办法控制选项是否可以出现多次或始终必须是一个单独的单词(没有“=”)等,但这个例子是一个非常简单的例子。