Я намагаюся записати функції завершення деяких написаних нами спеціальних функцій, але, здається, справді бореться навіть із найпростішими.
Приклад функції:
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-завершення репо для подібних команд, але не можу знайти щось подібне до того, що мені потрібно.
Будь-яка допомога з початком роботи буде дуже вдячна!
Оновлення
На основі відповіді @ cuonglm я використав:
#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 "$@"
Що я забув згадати в первісному запитанні, це те, що я також хотів, щоб завершення другого аргументу залежало від першого (обидва вони базуються на динамічному виконанні якогось коду), наприклад:
$ eb_instances <cursor>TAB
cuonglm test
отримує завершення, які я хочу. Після вибору скажу перший і спробую автоматично виконати:
$ eb_instances cuonglm <cursor>TAB
Я хочу створити параметри завершення, виконавши eb_names cuonglm
, і, якщо можливо, також розгортання завершень, наприклад, якщо правильний кандидат був foo-bar
,
$ eb_instances cuonglm foo<cursor>TAB
Я хочу створити параметри завершення, виконавши eb_names cuonglm foo
cuonglm test
прийтиsed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '