Não expanda curinga na conclusão da tabulação

5

Eu estou querendo saber como eu posso configurar zsh para não expandir o curinga em um nome de arquivo. Por exemplo, eu tenho um diretório de algumas centenas de arquivos com o seguinte nome:

a.foo-bar a.foo b.foo-bar b.foo c.foo-bar c.foo

Eu gostaria de poder realizar uma conclusão de tabulação correspondendo após um caractere curinga, então

cat *.foo-< tab > => cat *.foo-bar

Isso é o que eu recebo em vez disso:

$  cat *.foo-
=> cat a.foo-bar
   file
   a.foo-bar b.foo-bar c.foo-bar
    
por BMorgenthaler 18.08.2014 / 18:15

3 respostas

5

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

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

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

  3. 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
    }
    
  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 é o \ na frente da estrela na lista apresentada. Mas isso é apenas uma falha óptica, pois a conclusão está correta: *.foo ou *.foo-bar .

por 19.08.2014 / 19:59
0

Eu não acho que isso seja possível. Você está perguntando ao shell não apenas para descobrir quais arquivos você quer e não quer terminar como "válido de acordo com sua expansão curinga", mas você quer que o shell descubra a "melhor" expressão curinga que expandirá deste jeito. Eu esperaria que a segunda parte fosse NP-completa.

    
por 18.08.2014 / 19:38
0

Eu ainda não vejo como você pode conseguir o que quer, mas você pode fazer uma modificação (que pode ou não ser útil para você) via setopt GLOB_COMPLETE dar-lhe apenas uma expansão e, em seguida, você pode tab através deles ... ou editar apenas aquele para ser um * novamente, que pode pelo menos ser uma pequena melhoria).

Você também pode pesquisar em man zshoptions , man zshcompctl , man zshcompwid e / ou similar. O material de conclusão do zsh é bastante complexo, então estou supondo que pode haver uma maneira de fazer isso.

Observe também uma questão relacionada:

Como faço para obter o zsh's Preenchimento automático para completar curingas como o bash faz?

    
por 19.08.2014 / 01:05