Conclusão inteligente de palavras no meio de uma palavra

9

Considere um arquivo com as duas linhas a seguir:

someLongFunction
someFunction

Quando estou no modo de inserção no meio da segunda palavra

some|Function

e eu pressiono Ctrl-n, recebo

someLongFunctionFunction

Existe uma maneira de configurar o Vim para que eu obtenha a seguinte conclusão "inteligente"?

someLongFunction
s3rvac
fonte

Respostas:

5

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!)

VanLaser
fonte