2013-06-26 10 views
8

zsh è grande, ma il suo sistema di completamento è molto varia. E la documentazione manca di buoni esempi. Esiste un modello per il completamento per un'applicazione specifica. Il completamento otterrebbe i dati di corrispondenza da un file, separati da nuove righe?Fai zsh argomentazioni complete da un file

Ho provato modificando un vecchio esempio di mio che prende i dati delle partite "live":

~ % cat .zsh/completers/_jazzup 
#compdef jazz_up 
_arguments "2: :(`mpc lsplaylists|sed -e 's# #\\\\ #g'`)" 

potevo fornire cat my_file lì, invece di mpc invocazione e così via, ma ci sarebbe una più elegante modo per farlo compito semplice? E tale completamento è specifico del posizionamento: puoi fornire un esempio in cui zsh tenterebbe di completare in qualsiasi momento dopo che il nome del programma è stato riconosciuto?

dati match avranno spazi bianchi e così via, il completamento dovrebbero sfuggire al WS. Esempio di questo:

Foo bar 
Barbaric 
Get it (42) 

Ora, se questo termine sarebbe essere configurato per un comando Say, dovremmo ottenere questo tipo di comportamento da zsh:

$ Say Fo<TAB> 
$ Say Foo\ bar 
$ Say Ge<TAB> 
$ Say Get\ it\ \(42\) 

risposta

15

esigenze di completamento semplici sono meglio affrontati con _describe, abbina un array con opzioni di completamento e una descrizione per loro (puoi usare più coppie di array/descrizioni, controlla il manuale).

(_arguments è grande, ma troppo complesso.)

[...]

Innanzitutto creare un file

echo "foo\nbar\nbaz\nwith spac e s\noh:noes\noh\:yes" >! ~/simple-complete 

quindi creare un file di _simple qualche parte nel vostro $fpath:

#compdef simple 

# you may wish to modify the expansion options here 
# PS: 'f' is the flag making one entry per line 
cmds=(${(uf)"$(< ~/simple-complete)"}) 

# main advantage here is that it is easy to understand, see alternative below 
_describe 'a description of the completion options' cmds 

# this is the equivalent _arguments command... too complex for what it does 
## _arguments '*:foo:(${cmds})' 

quindi

function simple() { echo $* } 
autoload _simple # do not forget BEFORE the next cmd! 
compdef _simple simple # binds the completion function to a command 

simple [TAB] 

funziona. Assicurati che il file di completamento _simple sia posizionato da qualche parte nel tuo fpath.

noti che : nella lista di opzione dovrebbe essere utilizzata per separare un'opzione dal loro descrizione (individuale) (oh:noes). In questo modo non funzionerà con _describe a meno che non lo citiate (oh\:yes). L'esempio commentato _arguments non utilizzerà lo : come separatore.

+0

Fantastico. Ti assegnerò un premio se riesci ad aprire un po 'sui riferimenti e sui dettagli, ma questo è l'esempio perfetto che stavo cercando. – progo

+2

Grazie mille. Questa è di gran lunga la soluzione più concisa che ho trovato per il completamento di zsh. Merita molto più uptotes di quanto non sia ricevuto. –

+0

Dove posso ottenere informazioni sui flag 'uf' – Timo