Câu trả lời:
Sau đây chỉ là một câu trả lời mô phỏng nhanh (nghĩa là chức năng cho đến khi nó không hoặc cho đến khi nó phá vỡ một cái gì đó :)), nhưng nó cho thấy rằng "nó có thể":
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
Những gì đoạn mã trên cố gắng làm là: sau khi hoàn thành, xác minh xem WORD dưới con trỏ có dài hơn từ đã hoàn thành hay không, và nếu vậy, nó sẽ kiểm tra thêm xem 'phần còn lại' có khớp với phần cuối của quá trình hoàn thành hay không (trong ví dụ của bạn, "Chức năng"). Nếu có, phần còn lại của WORD sẽ bị xóa (điều này giả định một số điều về vị trí con trỏ).
(Tôi khá chắc chắn rằng có nhiều cách thông minh hơn để thực hiện tất cả điều này và tôi muốn xem chúng!)