2013-06-26 11 views
8

zsh jest świetny, ale jego system realizacji jest bardzo zróżnicowany. W dokumentacji brakuje dobrych przykładów. Czy istnieje szablon do wypełnienia dla konkretnej aplikacji. Uzupełnienie otrzyma dane dopasowania z pliku, oddzielone znakami nowego wiersza?Wykonaj pełne argumenty zsh z pliku

Próbowałem modyfikowania starszą przykład kopalni, która pobiera dane meczu „na żywo”:

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

mogę dostarczyć cat my_file tam zamiast mpc inwokacji i tak dalej, ale tam będzie bardziej elegancki sposób to zrobić proste zadanie? A to zakończenie jest specyficzne dla miejsca docelowego: czy możesz podać przykład, w którym zsh spróbuje ukończyć w dowolnym momencie po rozpoznaniu nazwy programu?

Dane dopasowania będą miały białe znaki i tak dalej, zakończenie powinno uciec WS. Przykład, że:

Foo bar 
Barbaric 
Get it (42) 

Teraz, jeśli ta realizacja będzie skonfigurowany dla polecenia Say powinniśmy dostać tego rodzaju zachowanie z zsh:

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

Odpowiedz

15

Proste potrzeby uzupełniania są lepiej adresowane _describe, paruje tablicę zawierającą opcje uzupełniania i ich opis (można użyć wielu par tablic/opisów, sprawdzić instrukcję).

(_arguments jest wielki, ale zbyt skomplikowane.)

[...]

Najpierw utwórz plik

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

następnie utworzyć plik _simple gdzieś w $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})' 

następnie

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

simple [TAB] 

Działa. Upewnij się, że plik zakończenia _simple znajduje się gdzieś w twoim fpath.

Należy zauważyć, że : na liście opcji ma służyć do oddzielania opcji od ich (indywidualnych) opisów (oh:noes). To nie zadziała z _describe, chyba że ją zacytujesz (oh\:yes). Zakodowany przykład _arguments nie użyje : jako separatora.

+0

Fantastyczne. Przyznam trochę nagrody, jeśli możesz otworzyć trochę o referencjach i szczegółach, ale to jest doskonały przykład, którego szukałem. – progo

+2

Dziękuję, bardzo. Jest to zdecydowanie najbardziej zwięzły przewodnik, który znalazłem dla zakończenia zsh. Zasługuje na znacznie więcej awansów niż otrzymała. –

+0

Gdzie mogę uzyskać informacje o flagach 'uf'? – Timo