VIM обновить полное всплывающее окно при вводе

Я пытаюсь использовать complete() в vim так что он также читает значение.

Например, из vim"s complete() пример,

inoremap <F5> <C-R>=ListMonths()<CR>

func! ListMonths()
  call complete(col('.'), ['January', 'February', 'March',
    \ 'April', 'May', 'June', 'July', 'August', 'September',
    \ 'October', 'November', 'December'])
  return ''
endfunc

если я наберу <F5> Я получу все месяцы как всплывающее окно. Теперь, что я хочу, так это то, что если я наберу "J", будут показаны только январь, июнь и июль, "Ju" даст июнь и июль и так далее.

Я прочитал vim-docи попробовал complete_check, но это не так.

Кроме того, я попытался использовать пример omnicomplete E839 в vimdoc, но я не могу правильно назвать это, всегда получая недопустимый аргумент.

Пожалуйста, предложите мне предпочтительный метод меню с дополнением при вводе, и как его использовать.

1 ответ

Решение

Во-первых, в этом примере завершение не учитывает уже набранную базу, потому что оно всегда начинает завершение в позиции курсора (через col('.')).

Во-вторых, чтобы получить поведение "уточняйте список по мере ввода", вам потребуется следующая настройка:

:set completeopt+=longest

К сожалению, из-за (давно известной) ошибки, complete() не считает 'completeopt' вариант. Вы должны использовать 'completefunc' вместо этого, как в этом переписанном примере:

fun! CompleteMonths(findstart, base)
    if a:findstart
        " locate the start of the word
        let line = getline('.')
        let start = col('.') - 1
        while start > 0 && line[start - 1] =~ '\a'
            let start -= 1
        endwhile
        return start
    else
        echomsg '**** completing' a:base
        " find months matching with "a:base"
        let res = []
        for m in ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
            if m =~ '^' . a:base
            call add(res, m)
            endif
        endfor
        return res
    endif
endfun
inoremap <F5> <C-o>:set completefunc=CompleteMonths<CR><C-x><C-u>
Другие вопросы по тегам