2016-01-12 7 views
3

Я пытаюсь использовать complete() в vim, чтобы он читал значение.vim update full popup as I type

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

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, но я не могу его правильно назвать, всегда получая недопустимый аргумент.

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

ответ

3

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

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

:set completeopt+=longest 

К сожалению, из-за (long known) bug, 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>