Como fornecer sugestões de preenchimento automático que não correspondem ao prefixo na conclusão do zsh

Como fornecer sugestões de preenchimento automático que não correspondem ao prefixo na conclusão do zsh

Eu tenho uma função de preenchimento automático zsh para um comando chamado gdque faz uma pesquisa difusa com base no $words[CURRENT]valor e retorna sugestões. A pesquisa está funcionando bem, mas o zsh não mostra nenhum candidato porque o texto inserido não é um prefixo da sugestão.

por exemplo

% gd hw

Pode gerar a conclusãooh hello there, world

Mas zsh não mostrará isso porque hwnão foi encontrado no início da sugestão.

Posso fazer com que o zsh ofereça a sugestão como algo que substituiria a palavra atual quando escolhida?

Aqui está uma versão simplificada do meu script de conclusão em um arquivo chamado _gdque está no meu fpath:

#compdef gd

_gd() {
  local -a list

  clue="$words[CURRENT]"

      pattern=""
      for i in $(seq $#clue)
      do
        pattern="$pattern.*${clue[i]}"
      done
      while read dir
      do
        list=( $list $dir )
      done <<<$(grep "$pattern" ~/.recent-dirs)

  _describe gd list
}

Responder1

Livre-se dessa _gdfunção e adicione o seguinte ao seu .zshrcarquivo:

autoload -Uz compinit
compinit
zstyle ':completion:*' matcher-list 'r:|?=**'

Isso informa ao código de conclusão para permitir qualquer número adicional entre e em torno do que você digitou. Com isso, Zsh agora pode ser concluído de forma difusaqualquer coisa.

  • r:X|Y=Zprocura todas as substrings não sobrepostas que correspondam ao padrão XYe faz com que a parte correspondida porX tambémcorresponde a qualquer coisa correspondida por padrão Zao verificar conclusões correspondentes.
  • ?corresponde a qualquer caractere.
  • Se Xou Yfor igual a *, corresponde a qualquer número de caracteres consecutivos.
  • Se Zfor igual *, corresponde a qualquer número de caracteres consecutivosexcetoqualquer coisa correspondida por Y.
  • Se Zfor igual a **, corresponde a qualquer número de caracteres consecutivos.
  • Em r:|?=**, Xé igual à string vazia.
  • Por padrão, o Zsh já adiciona um curinga ao final da sua entrada, completando assim o círculo para uma correspondência difusa completa.

Você pode encontrar a documentação aqui:http://zsh.sourceforge.net/Doc/Release/Completion-Widgets.html#Completion-Matching-Control

Responder2

Isso é hack enquanto espero por respostas mais sábias...

O que fiz foi fazer com que meu gerador de sugestões produzisse sugestões como:

hw»oh hello there, world

Como o comando (na verdade, uma função) está sob meu controle, simplesmente retiro o lixo no início:

input="${input#*»}"

Mas seria bom saber como fazê-lo corretamente.

informação relacionada