当我输入时,vim更新完整的弹出窗口

时间:2016-01-12 14:11:24

标签: vim omnicomplete

我尝试在complete()中使用vim,以便它也会读取该值。

例如,来自vim' 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>,我会将所有月份作为弹出窗口。现在,我想要的是,如果我输入&#34; J&#34;,只会显示1月,6月和7月,&#34; Ju&#34;将给六月和七月,等等。

我看了vim-doc,并尝试了complete_check,但事实并非如此。

此外,我尝试在E839中使用omnicomplete示例vimdoc,但我无法正确调用它,总是得到无效的参数。

请在我输入时告诉我菜单的首选方法,以及如何使用。

1 个答案:

答案 0 :(得分:3)

首先,该示例完成不考虑已经键入的基数,因为它总是在光标位置开始完成(通过col('.'))。

其次,要获得“键入时精炼列表”行为,您需要以下设置:

:set completeopt+=longest

不幸的是,由于(long known) bugcomplete()不考虑'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>