A seguir, é apenas uma resposta rápida de mock-up (ou seja, funcional até que não funcione ou quebre alguma coisa :)), mas mostra que "é possível":
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
O que o código acima tenta fazer é: após a conclusão, verifica se a PALAVRA sob o cursor é maior que a palavra concluída e, nesse caso, verifica se o 'restante' corresponde à última parte da conclusão (no seu exemplo, "Função"). Caso isso aconteça, o restante da PALAVRA é excluída (isso pressupõe algumas coisas sobre a posição do cursor).
(Tenho certeza de que existem maneiras mais inteligentes de fazer tudo isso e gostaria de vê-las!)