Pengisian kata cerdas saat di tengah kata

9

Pertimbangkan file dengan dua baris berikut:

someLongFunction
someFunction

Ketika saya dalam mode insert di tengah kata kedua

some|Function

dan saya menekan Ctrl-n, saya mengerti

someLongFunctionFunction

Apakah ada cara mengkonfigurasi Vim sehingga saya mendapatkan penyelesaian "pintar" berikut sebagai gantinya?

someLongFunction
s3rvac
sumber

Jawaban:

5

Berikut ini hanya jawaban mock-up cepat (yaitu berfungsi sampai tidak, atau sampai rusak :)), tetapi itu menunjukkan bahwa "itu mungkin":

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

Apa yang coba dilakukan oleh kode di atas adalah: setelah selesai, memverifikasi apakah WORD di bawah kursor lebih panjang daripada kata yang selesai, dan, jika demikian, ia memeriksa lebih lanjut apakah 'sisanya' cocok dengan bagian terakhir dari penyelesaian (dalam contoh Anda, "Fungsi"). Jika ya, sisa WORD dihapus (ini mengasumsikan beberapa hal tentang posisi kursor).

(Saya cukup yakin ada lebih banyak cara pintar untuk menyelesaikan semua ini, dan saya ingin melihatnya!)

VanLaser
sumber