Finalización inteligente de palabras cuando está en medio de una palabra

9

Considere un archivo con las siguientes dos líneas:

someLongFunction
someFunction

Cuando estoy en el modo de inserción en el medio de la segunda palabra

some|Function

y presiono Ctrl-n, consigo

someLongFunctionFunction

¿Hay alguna forma de configurar Vim para que obtenga la siguiente finalización "inteligente"?

someLongFunction
s3rvac
fuente

Respuestas:

5

La siguiente es solo una respuesta de maqueta rápida (es decir, funcional hasta que no lo haga, o hasta que rompa algo :)), pero muestra que "es posible":

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

Lo que intenta hacer el código anterior es: después de la finalización, verifica si la PALABRA debajo del cursor es más larga que la palabra completada y, de ser así, verifica si su 'resto' coincide con la última parte de la finalización (en su ejemplo, "Función"). Si lo hace, se elimina el resto de la PALABRA (esto supone algunas cosas sobre la posición del cursor).

(Estoy bastante seguro de que hay formas más inteligentes de lograr todo esto, ¡y me gustaría verlas!)

VanLaser
fuente