Eu tenho uma função de preenchimento automático zsh para um comando chamado gd
que 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 hw
nã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 _gd
que 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 _gd
função e adicione o seguinte ao seu .zshrc
arquivo:
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=Z
procura todas as substrings não sobrepostas que correspondam ao padrãoXY
e faz com que a parte correspondida porX
tambémcorresponde a qualquer coisa correspondida por padrãoZ
ao verificar conclusões correspondentes.?
corresponde a qualquer caractere.- Se
X
ouY
for igual a*
, corresponde a qualquer número de caracteres consecutivos. - Se
Z
for igual*
, corresponde a qualquer número de caracteres consecutivosexcetoqualquer coisa correspondida porY
. - Se
Z
for 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.