2013-06-26 8 views
8

zsh ist großartig, aber seine Fertigstellung System ist sehr vielfältig. Und der Dokumentation fehlen gute Beispiele. Gibt es eine Vorlage zum Ausfüllen für eine bestimmte Anwendung? Die Vervollständigung würde ihre Matchdaten aus einer Datei erhalten, getrennt durch Zeilenumbrüche?Machen Sie zsh vollständige Argumente aus einer Datei

Ich habe versucht, ein älteres Beispiel von mir ändern, die Spieldaten „live“ nimmt:

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

ich cat my_file dort statt mpc Aufruf liefern könnte und so weiter, aber gäbe es diese eine elegantere Weise zu tun einfache Aufgabe? Und diese Vervollständigung ist dort placement-spezifisch: Können Sie ein Beispiel angeben, bei dem zsh versuchen würde, zu irgendeinem Zeitpunkt nach der Erkennung des Programmnamens abzuschließen?

Die Match-Daten haben Leerzeichen, und der Abschluss sollte dem WS entgehen. Beispiel dafür:

Foo bar 
Barbaric 
Get it (42) 

Nun, wenn das Abschluss für einen Say Befehl konfiguriert werden würde, sollten wir diese Art von Verhalten aus zsh erhalten:

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

Antwort

15

Einfache Abschluss Bedürfnisse besser angesprochen mit _describe, Es wird ein Array gepaart, das Abschlussoptionen und eine Beschreibung für sie enthält (Sie können mehrere Array-/Beschreibungspaare verwenden, lesen Sie das Handbuch).

(_arguments ist groß, aber zu komplex.)

[...]

Erstellen Sie zunächst eine Datei

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

Dann _simple irgendwo in Ihrem $fpath eine Datei erstellen:

#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})' 

dann

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

simple [TAB] 

es funktioniert. Stellen Sie nur sicher, dass die Abschlussdatei _simple irgendwo in Ihrer fpath platziert ist.

Beachten Sie, dass : in der Optionsliste verwendet werden soll, um eine Option von ihrer (individuellen) Beschreibung zu trennen (oh:noes). So funktioniert das nicht mit _describe, wenn Sie es nicht angeben (oh\:yes). Das auskommentierte _arguments Beispiel wird : nicht als Trennzeichen verwenden.

+0

Fantastisch. Ich werde etwas Bounty vergeben, wenn Sie ein wenig über Referenzen und Details aufklären können, aber dies ist das perfekte Beispiel, nach dem ich gesucht habe. – progo

+2

Vielen Dank. Dies ist bei weitem die prägnanteste Walkthrough, die ich für die Fertigstellung von zsh gefunden habe. Es verdient weit mehr Upvotes als es erhalten hat. –

+0

Wo kann ich Informationen über die 'uf'-Flags erhalten? – Timo

Verwandte Themen