Intelligente Wortvervollständigung mitten in einem Wort

9

Betrachten Sie eine Datei mit den folgenden zwei Zeilen:

someLongFunction
someFunction

Wenn ich mich mitten im zweiten Wort im Einfügemodus befinde

some|Function

und ich drücke Ctrl-n, ich verstehe

someLongFunctionFunction

Gibt es eine Möglichkeit, Vim so zu konfigurieren, dass ich stattdessen die folgende "intelligente" Vervollständigung erhalte?

someLongFunction
s3rvac
quelle

Antworten:

5

Das Folgende ist nur eine kurze Modellantwort (dh funktional, bis es nicht funktioniert oder bis es etwas kaputt macht :)), aber es zeigt, dass "es möglich ist":

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

Der obige Code versucht Folgendes: Überprüft nach Abschluss, ob das WORT unter dem Cursor länger als das vervollständigte Wort ist, und prüft in diesem Fall weiter, ob sein 'Rest' mit dem letzten Teil der Vervollständigung übereinstimmt (in Ihrem Beispiel: "Funktion"). Wenn dies der Fall ist, wird der Rest des WORTES gelöscht (dies setzt einige Dinge über die Cursorposition voraus).

(Ich bin mir ziemlich sicher, dass es klügere Möglichkeiten gibt, dies alles zu erreichen, und ich würde sie gerne sehen!)

VanLaser
quelle