Inteligentne uzupełnianie słów w środku słowa

9

Rozważ plik z następującymi dwoma wierszami:

someLongFunction
someFunction

Kiedy jestem w trybie wstawiania w środku drugiego słowa

some|Function

i naciskam Ctrl-n, rozumiem

someLongFunctionFunction

Czy istnieje sposób na skonfigurowanie Vima, aby zamiast tego uzyskać następujące „inteligentne” zakończenie?

someLongFunction
s3rvac
źródło

Odpowiedzi:

5

Poniżej znajduje się tylko szybka odpowiedź próbna (tzn. Działa, dopóki się nie powiedzie lub dopóki czegoś nie zepsuje :)), ale pokazuje, że „jest to możliwe”:

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

Powyższy kod próbuje zrobić: po zakończeniu sprawdza, czy WORD pod kursorem jest dłuższy niż uzupełnione słowo, a jeśli tak, sprawdza dalej, czy jego „reszta” odpowiada ostatniej części uzupełnienia (w Twoim przykładzie "Funkcjonować"). Jeśli tak, reszta WORD jest usuwana (zakłada to pewne rzeczy na temat pozycji kursora).

(Jestem prawie pewien, że są bardziej sprytne sposoby na osiągnięcie tego wszystkiego i chciałbym je zobaczyć!)

VanLaser
źródło