Próbuję ulepszyć starą funkcję uzupełniania. Chciałbym, aby aktualizował opcje wyświetlane w menu podręcznym podczas pisania nowych znaków
Moja funkcja uzupełniania to
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
Tego używam
:set completefunc=lh#icomplete#ecm
:inoremap µ <c-x><c-u><c-p>
Z mojego rozumienia dokumentacji, z którego korzystam <c-p>
, przechodzę do trzeciego stanu (zgodnie z menu | ins-complete-menu |), a kiedy wpisuję „dowolny drukowalny, nie biały znak” , powinienem być w stanie „Dodać ten znak i zmniejsz liczbę dopasowań. ”
Kiedy piszę w trybie wstawiania uµ
, menu zakończenia wyskakuje zgodnie z oczekiwaniami. Niestety, kiedy piszę x
(zaraz po µ
), jestem poza trybem ukończenia i ux
to, co dostaję do bufora.
Co zrobiłem źle lub czego nie zauważyłem w dokumentacji?
NB: Widziałem, że bez tego refresh=always
wyniki są filtrowane, z wyjątkiem tego, że chciałbym ponownie wywołać tę funkcję, aby zastosować niestandardowy filtr.
(Na wszelki wypadek używam gvim 7.4-908)
źródło
Odpowiedzi:
Po dalszych badaniach (i niektórych inżynierii odwrotnej).
Nie potrafię wyjaśnić, dlaczego wypełnienie nie jest ściśle zgodne z dokumentacją. Chyba będę musiał zapytać na vim_dev.
W każdym razie wydaje się, że sposób na to polega na zarejestrowaniu nasłuchiwacza,
CursorMovedI
który ponownie wyzwoli zakończenie za każdym razem, gdy wstawiany jest znak.Trudność polega na tym, aby wiedzieć, kiedy przestać.
CompletionDone
nie ma sensu, ponieważ będzie uruchamiany po każdym naciśnięciu klawisza.InsertLeave
to dobry początek, ale nie obejmuje wszystkich przypadków, tjNie znalazłem innego sposobu niż zastąpienie
<cr>
i<c-y>
.Inne trudności polegają na wykryciu, kiedy nic się nie zmieniło, aby uniknąć pewnego rodzaju nieskończonych pętli i tak dalej.
Tak czy inaczej, oto mój obecny kod (który będzie używany w innych wtyczkach). Ostatnia wersja zostanie utrzymane tutaj . Jest dość długi, ale oto:
Które mogą być używane z:
Powinieneś być w stanie obserwować (pośrednio) wynik zastosowany do wyboru fragmentów C ++ dla mojej wtyczki ekspandera szablonów na tym screencastie .
źródło