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>