J'essaie d'écrire des fonctions de complétion pour certaines fonctions personnalisées que j'ai écrites, mais semble vraiment avoir du mal avec les plus élémentaires.
Un exemple de fonction est:
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"
}
Cela a deux arguments de position, <aws profile name>
et<environment name>
Je veux que les options de complétion <aws profile name>
soient dynamiquement disponibles en exécutant
sed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '
et que les compléments <environment name>
soient dynamiquement disponibles en exécutant une autre fonction que j'ai appelée eb_names
.
Je trouve la documentation assez clairsemée et difficile à suivre. J'ai également vu le dépôt zsh-complétions pour des commandes similaires, mais je n'arrive pas à trouver quelque chose de similaire à ce dont j'ai besoin.
Toute aide pour commencer serait très appréciée!
Mise à jour
Sur la base de la réponse de @ cuonglm , j'ai utilisé:
#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 "$@"
Ce que j'ai oublié de mentionner dans la question d'origine, c'est que je voulais aussi que l'achèvement du deuxième argument dépende du premier (qui sont tous deux basés sur l'exécution dynamique de code), par exemple:
$ eb_instances <cursor>TAB
cuonglm test
obtient les finitions que je veux. Une fois que j'ai sélectionné, dites le premier et essayez de terminer automatiquement:
$ eb_instances cuonglm <cursor>TAB
Je souhaite générer les options de complétion en exécutant eb_names cuonglm
, et si possible, également, une analyse détaillée des compléments, par exemple si le bon candidat était foo-bar
,
$ eb_instances cuonglm foo<cursor>TAB
Je veux générer les options de complétion en exécutant eb_names cuonglm foo
la source
cuonglm test
venirsed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '
(cuonglm test)
par($(sed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '))
, changezcompadd "$@" prod staging dev
encompadd "$@" $(eb_names)
.eb_names
le premier argument, c'est-à-dire,production
oustaging
comment faire? Merci beaucoup, j'ai obtenu pas mal de choses triées avec ça.$1
ou$2
, mais pas de dés.