Estou tentando aprimorar uma função de conclusão antiga. Gostaria de atualizar as opções exibidas no menu pop-up enquanto digito novos caracteres
Minha função de conclusão é
function! lh#icomplete#ecm(findstart, base) abort
if a:findstart
let l = getline('.')
let startcol = match(l[0:col('.')-1], '\v\S+$')
if startcol == -1
let startcol = col('.')-1
endif
" let g:debug+= ["findstart(".a:base.") -> ".(startcol)]
return startcol
else
" let g:debug += ["matching(".a:base.")"]
let words = ['un', 'deux', 'trois', 'trente-deux', 'unité']
call filter(words, 'v:val =~ a:base')
" return { 'words' : words}
return { 'words' : words, 'refresh' : 'always'}
endif
endfunction
Que eu uso com
:set completefunc=lh#icomplete#ecm
:inoremap µ <c-x><c-u><c-p>
Pelo meu entendimento da documentação, pelo fato de que uso <c-p>
, entro no terceiro estado (de acordo com | ins-conclusão-menu |) e, quando digito "qualquer caractere imprimível e não branco", consigo "Adicionar esse caractere e reduza o número de correspondências ".
Quando digito no modo de inserção uµ
, o menu de conclusão é exibido conforme o esperado. Infelizmente, quando eu digito x
(logo após o µ
), estou fora do modo de conclusão e ux
é o que recebo no meu buffer.
O que fiz de errado ou perdi na documentação?
Nota: vi que refresh=always
, sem , os resultados são filtrados, exceto que eu gostaria de chamar a função novamente para aplicar um filtro personalizado.
(Apenas no caso, estou usando o gvim 7.4-908)
fonte
Respostas:
Após investigações adicionais (e algumas engenharia reversa).
Não sei explicar por que a conclusão não segue rigorosamente a documentação. Vou ter que perguntar no vim_dev, eu acho.
De qualquer forma, parece que a maneira de fazer isso consiste em registrar um ouvinte
CursorMovedI
que acionará a conclusão novamente toda vez que um personagem for inserido.A dificuldade é saber quando parar.
CompletionDone
é inútil, pois será acionado após cada pressionamento de tecla.InsertLeave
é um bom começo, mas não abrange todos os casos, ou seja,Não encontrei outra maneira senão substituir
<cr>
e<c-y>
.Outras dificuldades consistem em detectar quando nada mudou para evitar tipos de loops infinitos e assim por diante.
De qualquer forma, aqui está o meu código atual (que será usado em outros plugins). A última versão será mantida aqui . É bastante longo, mas aqui está:
Que pode ser usado com:
Você deve observar (indiretamente) o resultado aplicado à seleção de trechos em C ++ para o meu plug-in expansor de modelos neste screencast .
fonte