
Gostaria de saber como posso configurarzshparanãoexpanda o curinga em um nome de arquivo. Por exemplo, tenho um diretório com algumas centenas de arquivos com o seguinte nome:
a.foo-bar a.foo b.foo-bar b.foo c.foo-bar c.foo
Gostaria de poder realizar uma correspondência de conclusão de tabulaçãodepoisum curinga, então
cat *.foo-< tab > => cat *.foo-bar
Em vez disso, isso é o que recebo:
$ gato *.foo- => gato a.foo-bar arquivo a.foo-bar b.foo-bar c.foo-bar
Responder1
Uma opção é substituir a ligação de chave padrão pela TAB
chave
bindkey "^I" expand-or-complete
com
bindkey "^I" complete-word
que não expandirá *
para todos os arquivos correspondentes, mas deixará a estrela intocada. Dessa forma, você se livra da lista interminável, mas ainda assim não completa a expressão global.
Para resolver isso é muito mais complicado. Você tem que escrever o seu própriowidget de conclusão(ver man zshcompwid
).
Vamos começar com a definição:
zle -C complete-glob menu-complete compglob
Isso apresenta o novo widgetglobo completo, que se comporta comomenu completoe usa ofunção shell compglobpara gerar as correspondências.
[Nota: Se você não quiser a conclusão do menu, use as opções muito mais rudimentarespalavra completaouescolhas de lista]
Vincule este 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 shellcompglobda 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 é a
\
frente da estrela na lista apresentada. Mas esta é apenas uma falha óptica, pois o preenchimento está correto:*.foo
ou*.foo-bar
.
Responder2
Eu não acho que isso seja possível. Você está pedindo ao shell não apenas para descobrir quais arquivos você faz e não deseja que sejam "válidos de acordo com sua expansão curinga", mas deseja que o shell descubra a "melhor" expressão curinga que irá expandir Por aqui. Eu esperaria que a segunda parte fosse NP-completa.
Responder3
Ainda não vejo uma maneira de conseguir exatamente o que procura, mas você pode obter uma pequena modificação (que pode ou não ser útil para você) via setopt GLOB_COMPLETE
(isso lhe dará apenas uma expansão, e então você pode navegar por eles... ou editar apenas aquele para ser *
novamente, o que pode ser pelo menos uma pequena melhoria).
Você também pode pesquisar em man zshoptions
, e man zshcompctl
/ man zshcompwid
ou similares. O material de conclusão do zsh é bastante complexo, então acho que pode haver uma maneira de fazer isso.
Observe também uma questão um tanto relacionada:
Como faço para que o preenchimento automático do zsh complete curingas como o bash faz?