Ich versuche, Vervollständigungsfunktionen für einige benutzerdefinierte Funktionen zu schreiben, die ich geschrieben habe, aber es scheint, als würde ich selbst mit den grundlegendsten Schwierigkeiten haben.
Eine Beispielfunktion ist:
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"
}
Dies hat zwei Positionsargumente <aws profile name>
und<environment name>
Ich möchte, dass die Vervollständigungsoptionen <aws profile name>
durch Ausführen dynamisch verfügbar
sed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '
sind und die Vervollständigungsoptionen <environment name>
durch Ausführen einer anderen von mir aufgerufenen Funktion dynamisch verfügbar sind eb_names
.
Ich finde die Dokumentation recht spärlich und schwer zu befolgen. Ich habe auch das Repo von zsh-completions für ähnliche Befehle gesehen, kann aber anscheinend nicht das finden, was ich brauche.
Jede Hilfe, die anfängt, wäre sehr dankbar!
Aktualisieren
Basierend auf der Antwort von @ cuonglm habe ich Folgendes verwendet:
#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 "$@"
Was ich in der ursprünglichen Frage vergessen habe, war, dass ich auch wollte, dass die Vervollständigung des zweiten Arguments vom ersten abhängig ist (beide basieren auf der dynamischen Ausführung von Code), zum Beispiel:
$ eb_instances <cursor>TAB
cuonglm test
bekommt die Vervollständigungen, die ich will. Sobald ich ausgewählt habe, sage ich die erste und versuche, sie automatisch zu vervollständigen:
$ eb_instances cuonglm <cursor>TAB
Ich möchte die Vervollständigungsoptionen generieren, indem ich einen eb_names cuonglm
Drilldown für die Vervollständigungen durchführe , wenn beispielsweise der richtige Kandidat war foo-bar
.
$ eb_instances cuonglm foo<cursor>TAB
Ich möchte die Vervollständigungsoptionen durch Ausführen von generieren eb_names cuonglm foo
quelle
cuonglm test
vonsed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '
(cuonglm test)
mit($(sed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '))
, änderncompadd "$@" prod staging dev
zucompadd "$@" $(eb_names)
.eb_names
das erste Argument überholt werden muss, dhproduction
oderstaging
wie mache ich das? Vielen Dank, ich habe einige Dinge damit sortiert.$1
oder zu referenzieren$2
, aber keine Würfel.