Uma opção é substituir a chave padrão da chave TAB
bindkey "^I" expand-or-complete
com
bindkey "^I" complete-word
que não expandirá *
para todos os arquivos correspondentes, mas deixará a estrela intacta. Dessa forma, você se livra da lista interminável, mas ainda não completa a expressão globbing.
Para resolver isso é muito mais complicado.
Você tem que escrever seu próprio widget de conclusão (veja man zshcompwid
).
-
Vamos começar com a definição:
zle -C complete-glob menu-complete compglob
Isto introduz o novo widget complete-glob , que se comporta como menu-complete e usa a função shell compglob em> para gerar as correspondências.
[Nota: Se você não quiser a conclusão do menu, use as opções muito mais rudimentares palavra completa ou lista de opções ]
-
Vincule esse novo widget a um atalho conveniente, como
CTRL+K
:bindkey "^K" complete-glob
Não vincule isso a
TAB
, pois o widget em sua forma atual apenas completa arquivos! -
Defina a função do shell compglob da seguinte forma, que faz o trabalho real:
compglob () { setopt localoptions globsubst compset -P '*' files=(${IPREFIX}*) display=(${files/${IPREFIX}/${(q)IPREFIX}}) glob=(${files/${IPREFIX}/}) compadd -d display -- $glob }
-
Demonstração:
$ touch a.foo-bar a.foo b.foo-bar b.foo c.foo-bar c.foo $ cat *.f<CTRL+K> $ cat *.foo \*.foo \*.foo-bar
A única falha que vejo é o
\
na frente da estrela na lista apresentada. Mas isso é apenas uma falha óptica, pois a conclusão está correta:*.foo
ou*.foo-bar
.