Conclusões automáticas de Zsh dinâmicas

1

Estou tentando escrever funções de conclusão para algumas funções personalizadas que escrevi, mas parece que estou realmente lutando com as mais básicas.

Uma função de exemplo é:

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"
}

Isso tem dois argumentos posicionais, <aws profile name> e <environment name>

Eu quero que as opções de conclusão de <aws profile name> estejam dinamicamente disponíveis executando sed -n -E 's/\[([a-zA-Z0-9_\-]+)\]//p' ~/.aws/credentials | tr \n ' ' e as conclusões para <environment name> estar dinamicamente disponível executando outra função que chamei de eb_names .

Eu estou achando a documentação bastante esparsa e difícil de seguir. Eu também vi o repositório zsh-completion para comandos semelhantes, mas parece que não consigo encontrar algo semelhante ao que eu preciso.

Qualquer ajuda para começar seria muito apreciada!

    
por zsquare 29.10.2015 / 08:07

1 resposta

0

Eu descobri que completações em zsh são um dos tópicos mais difíceis em ciência da computação para envolver meu cérebro. Muitas tentativas fracassadas durante muitos anos antes de começar a obtê-lo. A ajuda disponível on-line não é boa.

Para um comando que funciona como floop [ --student=<name> ] <directory> ou floop [ -s <name> ] <directory>

#compdef floop

local context state line

_arguments \
  '(--student -s)'{--student=,-s}"[student name to filter on]:student:->students" \
  "*:directory:_files -/"

case $state in
students)
    students=($(echo 'chris pat lynn paige'))
    _describe -t students "a student's name" students && return 0
    ;;
esac

Substitua o comando echo por um array literal zsh ou um comando que gere opções para a opção student.

A linha "*:directory:_files -/" é para o argumento posicional de um caminho de diretório.

Existem maneiras de controlar se a opção pode aparecer mais de uma vez ou sempre tem que ser uma palavra separada (não "=") etc, mas este exemplo é um exemplo bem simples.

    
por 11.03.2018 / 15:51