#compdef foo
local ret=1
_arguments \
'1:first:(a b c)' \
'*:files:_files' \
&& ret=0
return $ret
conclui a
b
ou c
para mim e, em seguida, pelo menos dois arquivos em teste. Alterando o manipulador do primeiro argumento
'1: :($(print -l a b c))' \
também funciona para mim. Se você tiver espaços na saída do que quer que seu programa faça, isso será um problema para a conclusão do primeiro argumento, mas não quebrará a conclusão dos arquivos subseqüentes para mim:
'1: :($(< ~/tmp/opts))' \
e depois:
% print -l "a b" c d > ~/tmp/opts
% rm ~/.zcompdump
% exec zsh -l
% foo
a b c d
apresenta a
ou b
não a b
: em geral, um deles verá coisas como ${(f)"$(...)"}
para dividir apenas em novas linhas, cd $fpath[-1]
normalmente terá o ZSH fornecido scripts de conclusão para estudar.
Mas não consigo reproduzir a declaração "conclusão de arquivos não funcionando"; talvez com o script de conclusão completo e saída adequada do programa?
Observe os comandos rm ~/.zcompdump ; exec zsh -l
que removem o cache de conclusão e iniciam uma nova instância do ZSH; uma alternativa menos intrusiva pode ser um descarregamento específico no nome do comando específico:
function zbouncecompdef { unfunction _$1; autoload -U _$1; }