Das Folgende ist nur eine kurze Modellantwort (dh funktional, bis es nicht funktioniert oder bis es etwas kaputt macht :)), aber es zeigt, dass "es möglich ist":
augroup completion
autocmd!
autocmd CompleteDone * call PostCompletion()
augroup END
function! PostCompletion()
if !empty(v:completed_item)
"check if text after current cursor position is part of the match
let crt_word = expand('<cWORD>')
let compl_word = v:completed_item['word']
let lcw = len(compl_word)
let leftover = strpart(crt_word, lcw)
let lfl = len(leftover)
if lfl > 0
let endcompl = strpart(compl_word, lcw - lfl)
if leftover ==# endcompl
let cpos = getcurpos()
normal dW
call setpos('.', cpos)
endif
endif
endif
endfunction
Der obige Code versucht Folgendes: Überprüft nach Abschluss, ob das WORT unter dem Cursor länger als das vervollständigte Wort ist, und prüft in diesem Fall weiter, ob sein 'Rest' mit dem letzten Teil der Vervollständigung übereinstimmt (in Ihrem Beispiel: "Funktion"). Wenn dies der Fall ist, wird der Rest des WORTES gelöscht (dies setzt einige Dinge über die Cursorposition voraus).
(Ich bin mir ziemlich sicher, dass es klügere Möglichkeiten gibt, dies alles zu erreichen, und ich würde sie gerne sehen!)