Sto cercando di scrivere funzioni di completamento per alcune funzioni personalizzate che ho scritto, ma sembra che stia davvero lottando con anche le più elementari.
Una funzione di esempio è:
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"
}
Questo ha due argomenti posizionali, <aws profile name>
e<environment name>
Voglio che le opzioni di completamento <aws profile name>
siano disponibili dinamicamente eseguendo
sed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '
, mentre i completamenti <environment name>
siano dinamicamente disponibili eseguendo un'altra funzione che ho chiamato eb_names
.
Sto trovando la documentazione abbastanza scarsa e difficile da seguire. Ho anche visto il repository di completamenti zsh per comandi simili ma non riesco a trovare qualcosa di simile a quello di cui ho bisogno.
Qualsiasi aiuto per iniziare sarebbe molto apprezzato!
Aggiornare
Sulla base della risposta di @ cuonglm , ho usato:
#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 "$@"
Quello che ho dimenticato di menzionare nella domanda originale era che volevo anche che il completamento del secondo argomento dipendesse dal primo (entrambi i quali sono dinamici in base all'esecuzione di un codice), ad esempio:
$ eb_instances <cursor>TAB
cuonglm test
ottiene i completamenti che desidero. Una volta selezionato dì il primo e provo a completare automaticamente:
$ eb_instances cuonglm <cursor>TAB
Voglio generare le opzioni di completamento eseguendo eb_names cuonglm
e, se possibile, anche il drill-down dei completamenti, ad esempio se il candidato corretto fosse foo-bar
,
$ eb_instances cuonglm foo<cursor>TAB
Voglio generare le opzioni di completamento eseguendo eb_names cuonglm foo
cuonglm test
venire dased -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '