Não expanda o curinga na conclusão da guia

Não expanda o curinga na conclusão da guia

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 TABchave

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).

  1. 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]

  2. 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!

  3. 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
    }
    
  4. 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: *.fooou *.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 zshcompwidou 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?

informação relacionada