Estoy tratando de escribir funciones de finalización para algunas funciones personalizadas que escribí, pero parece que estoy luchando incluso con las más básicas.
Una función de ejemplo es:
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"
}
Esto tiene dos argumentos posicionales, <aws profile name>
y<environment name>
Quiero que las opciones de finalización <aws profile name>
estén disponibles dinámicamente ejecutando
sed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '
, y las finalizaciones para <environment name>
que estén disponibles dinámicamente ejecutando otra función que he llamado eb_names
.
La documentación me parece bastante escasa y difícil de seguir. También he visto el repositorio zsh-completions para comandos similares, pero parece que no puedo encontrar algo similar a lo que necesito.
¡Cualquier ayuda para comenzar sería muy apreciada!
Actualizar
Basado en la respuesta de @ cuonglm , usé:
#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 "$@"
Lo que olvidé mencionar en la pregunta original fue que también quería que la finalización del segundo argumento dependiera del primero (ambos basados en la ejecución dinámica de algún código), por ejemplo:
$ eb_instances <cursor>TAB
cuonglm test
obtiene las terminaciones que quiero. Una vez que selecciono decir el primero, e intento completar automáticamente:
$ eb_instances cuonglm <cursor>TAB
Quiero generar las opciones de finalización ejecutando eb_names cuonglm
y, si es posible, también, profundizar en las finalizaciones, por ejemplo, si el candidato correcto era foo-bar
,
$ eb_instances cuonglm foo<cursor>TAB
Quiero generar las opciones de finalización ejecutando eb_names cuonglm foo
fuente
cuonglm test
venir desed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '
(cuonglm test)
con($(sed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '))
, cambiecompadd "$@" prod staging dev
acompadd "$@" $(eb_names)
.eb_names
el primer argumento, es decir,production
ostaging
¿cómo hago eso? Muchas gracias, he ordenado algunas cosas con esto.$1
o$2
, pero no dados.