我尝试在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
,但我无法正确调用它,总是得到无效的参数。
请在我输入时告诉我菜单的首选方法,以及如何使用。
答案 0 :(得分: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>