Estoy tratando de mejorar una función de finalización antigua. Me gustaría actualizar las opciones que se muestran en el menú emergente a medida que escribo nuevos caracteres
Mi función de finalización es
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 uso con
:set completefunc=lh#icomplete#ecm
:inoremap µ <c-x><c-u><c-p>
Desde mi comprensión de la documentación, el hecho que uso <c-p>
, entro en el tercer estado (de acuerdo con | ins-complete-menu |), y cuando escribo "cualquier carácter no blanco imprimible" debería poder "Agregar este personaje y reducir el número de partidos ".
Cuando escribo en modo de inserción uµ
, aparece el menú de finalización como se esperaba. Por desgracia, cuando escribo x
(justo después de µ
), estoy fuera del modo de finalización y ux
es lo que obtengo en mi búfer.
¿Qué hice mal o me perdí en la documentación?
NB: He visto que sin refresh=always
, los resultados se filtran, excepto que me gustaría volver a llamar a la función para aplicar un filtro personalizado.
(Por si acaso, estoy usando gvim 7.4-908)
fuente
Respuestas:
Después de más investigaciones (y algo de ingeniería inversa).
No puedo explicar por qué la finalización no sigue estrictamente la documentación. Tendré que preguntar en vim_dev, supongo.
De todos modos, parece que la forma de hacerlo consiste en registrar un oyente
CursorMovedI
que activará la finalización nuevamente cada vez que se inserte un personaje.La dificultad es saber cuándo parar.
CompletionDone
no sirve de nada, ya que se activará después de cada pulsación de tecla.InsertLeave
es un buen comienzo, pero no cubre todos los casos, es decirNo he encontrado otra manera que anular
<cr>
, y<c-y>
.Otras dificultades consisten en detectar cuándo nada ha cambiado para evitar una especie de bucles infinitos, etc.
De cualquier manera, aquí está mi código actual (que se usará en otros complementos). La última versión se mantendrá aquí . Es bastante largo, pero aquí está:
Que se puede usar con:
Debería poder observar (indirectamente) el resultado aplicado a la selección de fragmentos de C ++ para mi complemento expansor de plantilla en este screencast .
fuente