GNU/Linux >> Linux Esercitazione >  >> Linux

Completamento automatico Zsh dinamico per comandi personalizzati?

Sto cercando di scrivere funzioni di completamento per alcune funzioni personalizzate che ho scritto, ma sembra che stia davvero lottando anche con quelle 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 le opzioni di completamento per <aws profile name> essere disponibile dinamicamente eseguendo
sed -n -E 's/[([a-zA-Z0-9_-]+)]/1/p' ~/.aws/credentials | tr \n ' ' e i completamenti per <environment name> per essere dinamicamente disponibile eseguendo un'altra funzione che ho chiamato eb_names .

Trovo che la documentazione sia piuttosto scarsa e difficile da seguire. Ho anche visto il repository zsh-completions per comandi simili ma non riesco a trovare qualcosa di simile a quello di cui ho bisogno.

Qualsiasi aiuto per iniziare sarebbe molto apprezzato!

Aggiorna

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 "[email protected]" foo bar
  esac
}

_ebinstances "[email protected]"

Quello che ho dimenticato di menzionare nella domanda originale era che volevo anche che il completamento del secondo argomento dipendesse dal primo (entrambi sono basati sulla dinamica eseguendo del codice), ad esempio:

$ eb_instances <cursor>TAB
cuonglm  test

ottiene i completamenti che voglio. Una volta selezionato, pronuncia 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, drill-down sui completamenti, ad esempio se il candidato corretto era foo-bar ,

$ eb_instances cuonglm foo<cursor>TAB

Voglio generare le opzioni di completamento eseguendo eb_names cuonglm foo

Risposta accettata:

A prima vista, zsh Completion System sembra essere molto complesso e difficile da comprendere. Facciamo un esempio.

La prima cosa che devi sapere, zsh il sistema di completamento caricherà le funzioni di completamento da $fpath . Assicurati che la tua directory dei completamenti appaia in:

print -rl -- $fpath

(Se hai usato oh-my-zsh, c'è .oh-my-zsh/completions esisteva in $fpath , puoi semplicemente crearlo e inserire lì le tue funzioni di completamento)

Ora devi creare un file di completamento per la tua funzione, il suo nome deve iniziare con underscore _ , più il nome della tua funzione. Nel tuo caso, il suo nome è _eb_instances .

Aggiungi queste righe a _eb_instances file:

#compdef eb_instances

_eb_instances() {
  local state

  _arguments 
    '1: :->aws_profile'
    '*: :->eb_name'

  case $state in
    (aws_profile) _arguments '1:profiles:(cuonglm test)' ;;
              (*) compadd "[email protected]" prod staging dev
  esac
}

_eb_instances "[email protected]"

Hai fatto. Salva il file e avvia una nuova sessione per completare il test. Vedrai qualcosa del genere:

$ eb_instances <cursor>TAB
cuonglm  test

$ eb_instances cuonglm <cursor>TAB
dev      prod     staging

Puoi leggere la documentazione del sistema di completamento zsh su _arguments funzione, state variabile. Inoltre devi cambiare (cuonglm test) con il tuo sed comando e modifica prod staging dev ai tuoi eb_names funzione.

Correlati:Linux – Come ottenere in modo affidabile il nome del sistema operativo?

Se vuoi generare la base del 2° argomento su quale 1° argomento è passato, puoi usare $words[2] variabile:

case $state in
  (aws_profile) _arguments '1:profiles:(cuonglm test)' ;;
            (*) compadd "[email protected]" $(echo $words[2]) ;;
esac

Sostituisci echo con la tua vera funzione, nel tuo caso, è $(eb_names $words[2]) .

Se ti senti ancora difficile da realizzare, definisci semplicemente _eb_instances e eb_instances nel tuo .zshrc quindi chiama il completamento come:

compdef _eb_instances eb_instances

Devi inizializzare il sistema di completamento con:

autoload -U compinit
compinit

(Se hai usato oh-my-zsh , è stato caricato)


Linux
  1. 8 comandi Linux per una gestione efficace dei processi

  2. 10 comandi Linux per la diagnostica di rete

  3. Come specificare un completamento automatico personalizzato per comandi specifici?

  4. Foglio informativo sui comandi di Linux

  5. Nome del rilascio di Fedora 11:votalo

Comandi FreeDOS per i fan di Linux

Come usare i comandi personalizzati in LibreOffice

Oltre 20 comandi FFmpeg per principianti

40 importanti comandi Docker per gli sviluppatori di software

50 comandi essenziali di Nmap per gli amministratori di sistema

Comandi per la gestione dei processi in Linux