Интеллектуальное завершение слова в середине слова

9

Рассмотрим файл со следующими двумя строками:

someLongFunction
someFunction

Когда я в режиме вставки в середине второго слова

some|Function

и я нажимаю Ctrl-n, я получаю

someLongFunctionFunction

Есть ли способ настроить Vim так, чтобы вместо этого я получил следующее «умное» завершение?

someLongFunction
s3rvac
источник

Ответы:

5

Следующее является только быстрым макетным ответом (то есть функциональным, пока не произойдет, или пока что-то не сломается :)), но оно показывает, что «это возможно»:

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

Вышеприведенный код пытается сделать следующее: после завершения проверяет, длиннее ли слово под курсором, чем завершенное слово, и, если это так, он дополнительно проверяет, соответствует ли его «остаток» последней части завершения (в вашем примере, "Функция"). Если это так, остальная часть СЛОВА удаляется (это предполагает некоторые вещи относительно позиции курсора).

(Я уверен, что есть более умные способы сделать все это, и я хотел бы увидеть их!)

VanLaser
источник