Complétion intelligente des mots au milieu d'un mot

9

Considérez un fichier avec les deux lignes suivantes:

someLongFunction
someFunction

Quand je suis en mode insertion au milieu du deuxième mot

some|Function

et j'appuie Ctrl-n, je reçois

someLongFunctionFunction

Existe-t-il un moyen de configurer Vim pour que j'obtienne à la place l'achèvement "intelligent" suivant?

someLongFunction
s3rvac
la source

Réponses:

5

Ce qui suit n'est qu'une réponse de maquette rapide (c'est-à-dire fonctionnelle jusqu'à ce qu'elle ne le fasse pas ou jusqu'à ce qu'elle casse quelque chose :)), mais elle montre que "c'est possible":

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

Ce que le code ci-dessus essaie de faire est: après l' achèvement, vérifie si le MOT sous le curseur est plus long que le mot terminé, et, dans l'affirmative, il vérifie en outre si son `` reste '' correspond à la dernière partie de l'achèvement (dans votre exemple, "Une fonction"). Si c'est le cas, le reste du MOT est supprimé (cela suppose certaines choses sur la position du curseur).

(Je suis sûr qu'il existe des moyens plus intelligents d'accomplir tout cela, et j'aimerais les voir!)

VanLaser
la source