Следующее является только быстрым макетным ответом (то есть функциональным, пока не произойдет, или пока что-то не сломается :)), но оно показывает, что «это возможно»:
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
Вышеприведенный код пытается сделать следующее: после завершения проверяет, длиннее ли слово под курсором, чем завершенное слово, и, если это так, он дополнительно проверяет, соответствует ли его «остаток» последней части завершения (в вашем примере, "Функция"). Если это так, остальная часть СЛОВА удаляется (это предполагает некоторые вещи относительно позиции курсора).
(Я уверен, что есть более умные способы сделать все это, и я хотел бы увидеть их!)