La siguiente es solo una respuesta de maqueta rápida (es decir, funcional hasta que no lo haga, o hasta que rompa algo :)), pero muestra que "es posible":
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
Lo que intenta hacer el código anterior es: después de la finalización, verifica si la PALABRA debajo del cursor es más larga que la palabra completada y, de ser así, verifica si su 'resto' coincide con la última parte de la finalización (en su ejemplo, "Función"). Si lo hace, se elimina el resto de la PALABRA (esto supone algunas cosas sobre la posición del cursor).
(Estoy bastante seguro de que hay formas más inteligentes de lograr todo esto, ¡y me gustaría verlas!)