Ich versuche, eine alte Vervollständigungsfunktion zu verbessern. Ich möchte, dass die im Popup-Menü angezeigten Optionen aktualisiert werden, wenn ich neue Zeichen eingebe
Meine Abschlussfunktion ist
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
Das benutze ich mit
:set completefunc=lh#icomplete#ecm
:inoremap µ <c-x><c-u><c-p>
Nach meinem Verständnis der Dokumentation und der Tatsache, dass ich sie verwende <c-p>
, gehe ich in den dritten Zustand (gemäß | ins-completion-menu |), und wenn ich "ein druckbares, nicht weißes Zeichen" eingebe, sollte ich in der Lage sein, "hinzuzufügen" dieses Zeichen und reduzieren Sie die Anzahl der Übereinstimmungen. "
Wenn ich im Einfügemodus tippe uµ
, wird das Abschlussmenü wie erwartet angezeigt. Ach, wenn ich x
(kurz nach dem µ
) tippe, bin ich aus dem Abschlussmodus heraus und ux
ist, was ich in meinem Puffer erhalte.
Was habe ich falsch gemacht oder in der Dokumentation verpasst?
NB: Ich habe gesehen, dass ohne refresh=always
, die Ergebnisse gefiltert werden, außer ich möchte die Funktion erneut aufrufen, um einen benutzerdefinierten Filter anzuwenden.
(Nur für den Fall, ich benutze gvim 7.4-908)
quelle
Antworten:
Nach weiteren Untersuchungen (und einigen Reverse Engineering).
Ich kann nicht erklären, warum die Fertigstellung nicht genau der Dokumentation folgt. Ich werde wohl nach vim_dev fragen müssen.
Wie auch immer, es scheint so, als würde es darin bestehen, einen Listener zu registrieren
CursorMovedI
, der jedes Mal, wenn ein Zeichen eingefügt wird, die Fertigstellung erneut auslöst.Die Schwierigkeit besteht dann darin, zu wissen, wann aufzuhören ist.
CompletionDone
nützt nichts, da es nach jedem Tastendruck ausgelöst wird.InsertLeave
ist ein guter Anfang, aber er deckt nicht alle Fälle ab, dhIch habe keinen anderen Weg als das Überschreiben gefunden
<cr>
, und<c-y>
.Andere Schwierigkeiten bestehen darin, festzustellen, wann sich nichts geändert hat, um Endlosschleifen usw. zu vermeiden.
Jedenfalls ist hier mein aktueller Code (der in anderen Plugins verwendet wird). Die letzte Version wird hier gepflegt . Es ist ziemlich lang, aber hier ist es:
Welches kann verwendet werden mit:
Sie sollten in der Lage sein, (indirekt) das Ergebnis zu beobachten, das auf die Auswahl von C ++ - Snippets für mein Template-Expander-Plugin in diesem Screencast angewendet wurde .
quelle