Próbuję napisać funkcje uzupełniania dla niektórych niestandardowych funkcji, które napisałem, ale wydaje mi się, że naprawdę mam problemy z nawet najbardziej podstawowymi.
Przykładowa funkcja to:
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"
}
Ma to dwa argumenty pozycyjne <aws profile name>
i<environment name>
Chcę, aby opcje uzupełniania <aws profile name>
były dynamicznie dostępne po uruchomieniu
sed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '
, a uzupełnienia <environment name>
były dynamicznie dostępne po uruchomieniu innej funkcji, którą wywołałem eb_names
.
Uważam, że dokumentacja jest dość rzadka i trudna do naśladowania. Widziałem też repozytorium zsh-uzupełniające dla podobnych poleceń, ale nie mogę znaleźć czegoś podobnego do tego, czego potrzebuję.
Każda pomoc na początku byłaby mile widziana!
Aktualizacja
Na podstawie odpowiedzi @ cuonglm użyłem:
#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 "$@"
W pierwotnym pytaniu zapomniałem wspomnieć, że chciałem, aby uzupełnienie drugiego argumentu zależało od pierwszego (oba są oparte na dynamice i wykonują jakiś kod), na przykład:
$ eb_instances <cursor>TAB
cuonglm test
otrzymuje uzupełnienia, które chcę. Po wybraniu powiedz pierwszy i spróbuj wykonać automatycznie:
$ eb_instances cuonglm <cursor>TAB
Chcę wygenerować opcje ukończenia, wykonując eb_names cuonglm
, a jeśli to możliwe, również drążenie w szczegółach, na przykład jeśli prawidłowym kandydatem był foo-bar
,
$ eb_instances cuonglm foo<cursor>TAB
Chcę wygenerować opcje zakończenia, wykonując eb_names cuonglm foo
źródło
cuonglm test
pochodzićsed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '
(cuonglm test)
z($(sed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '))
, zmianycompadd "$@" prod staging dev
docompadd "$@" $(eb_names)
.eb_names
pierwszy argument, to znaczy,production
czystaging
, jak to zrobić? Wielkie dzięki, udało mi się uporządkować kilka rzeczy.$1
lub$2
, ale nie kości.