2013-06-26 7 views
8

zsh отлично, но его система завершения очень разнообразна. И в документации нет хороших примеров. Есть ли шаблон для завершения для конкретного приложения. Завершение будет получать данные о совпадении из файла, разделенные символами новой строки?Сделать zsh полными аргументами из файла

Я попытался модифицировать старую пример шахты, который принимает данные матча «вживую»:

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

Я мог бы поставить cat my_file там вместо mpc вызова и так далее, но будет ли более элегантный способ сделать это простая задача? И это завершение имеет специфику размещения: можете ли вы представить пример, где zsh попытается выполнить в любой момент после распознавания имени программы?

Данные о совпадении будут иметь пробелы и т. Д., Завершение должно покинуть WS. Пример того, что:

Foo bar 
Barbaric 
Get it (42) 

Теперь, если это завершение будет сконфигурировано для команды Say, мы должны получить этот вид поведения из zsh:

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

ответ

15

Простые потребности завершающие лучше решать с _describe, он сопоставляет параметры завершения хранения массива и описание для них (вы можете использовать несколько пар массива/описания, проверить руководство).

(_arguments велик, но слишком сложна.)

[...]

Сначала создайте файл

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

Затем создать файл _simple где-то в вашем $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})' 

затем

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

simple [TAB] 

Это работает. Просто убедитесь, что файл завершения _simple находится где-то в вашем fpath.

Обратите внимание, что : в списке опций предполагается использовать для разделения опциона из своего (индивидуального) описания (oh:noes). Так что это не будет работать с _describe, если вы не процитируете его (oh\:yes). Прокомментированный пример _arguments не будет использовать : в качестве разделителя.

+0

Фантастический. Я награду некоторыми наградами, если вы можете немного разобраться в ссылках и подробностях, но это служит прекрасным примером, который я искал. – progo

+2

Спасибо, много. Это, безусловно, самое краткое пошаговое руководство, которое я нашел для завершения zsh. Он заслуживает гораздо более высоких показателей, чем получил. –

+0

Где я могу получить информацию о флагах 'uf' – Timo

 Смежные вопросы

  • Нет связанных вопросов^_^