I'm trying to write completion functions for some custom functions I wrote, but seem to be really struggling with even the most basic ones.
An example function is:
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"
}
This has two positional arguments, <aws profile name>
and <environment name>
I want the completion options for <aws profile name>
to be dynamically available by running
sed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '
, and the completions for <environment name>
to be dynamically available by running another function I have called eb_names
.
I'm finding the documentation quite sparse and difficult to follow. I've also seen the zsh-completions repo for similar commands but can't seem to find something similar to what I need.
Any help getting started would be much appreciated!
Update
Based on @cuonglm's answer, I used:
#compdef ebinstances
_ebinstances() {
local state
_arguments \
'1: :->aws_profile'\
'*: :->eb_name'
case $state in
(aws_profile) _arguments '1:profiles:($(sed -n -E "s/\[([a-zA-Z0-9_\-]+)\]/\1/p" ~/.aws/credentials | tr \\n " "))' ;;
(*) compadd "$@" foo bar
esac
}
_ebinstances "$@"
What I forgot to mention in the original question was, that I also wanted the completion of the second argument be dependent on the first one (both of which are dynamic based executing some code), for example:
$ eb_instances <cursor>TAB
cuonglm test
gets the completions I want. Once I select say the first one, and try to auto complete:
$ eb_instances cuonglm <cursor>TAB
I want to generate the completion options by executing eb_names cuonglm
, and if possible, also, drilldown on the completions for example if the correct candidate was foo-bar
,
$ eb_instances cuonglm foo<cursor>TAB
I want to generate the completion options by executing eb_names cuonglm foo