Ce qui suit n'est qu'une réponse de maquette rapide (c'est-à-dire fonctionnelle jusqu'à ce qu'elle ne le fasse pas ou jusqu'à ce qu'elle casse quelque chose :)), mais elle montre que "c'est possible":
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
Ce que le code ci-dessus essaie de faire est: après l' achèvement, vérifie si le MOT sous le curseur est plus long que le mot terminé, et, dans l'affirmative, il vérifie en outre si son `` reste '' correspond à la dernière partie de l'achèvement (dans votre exemple, "Une fonction"). Si c'est le cas, le reste du MOT est supprimé (cela suppose certaines choses sur la position du curseur).
(Je suis sûr qu'il existe des moyens plus intelligents d'accomplir tout cela, et j'aimerais les voir!)