56 lines
1.3 KiB
VimL
56 lines
1.3 KiB
VimL
function! vsnip_integ#integration#asyncomplete#attach() abort
|
|
call asyncomplete#register_source(
|
|
\ s:get_source_option({
|
|
\ 'name': 'vsnip',
|
|
\ 'whitelist': ['*'],
|
|
\ 'completor': function('s:completor'),
|
|
\ })
|
|
\ )
|
|
endfunction
|
|
|
|
"
|
|
" get_source_option
|
|
"
|
|
function! s:get_source_option(opts) abort
|
|
let l:defaults = {
|
|
\ 'name': 'vsnip',
|
|
\ 'completor': function('s:completor'),
|
|
\ 'whitelist': ['*']
|
|
\ }
|
|
return extend(l:defaults, a:opts)
|
|
endfunction
|
|
|
|
"
|
|
" completor
|
|
"
|
|
function! s:completor(opts, ctx) abort
|
|
let l:before_line = getline('.')
|
|
let l:idx = min([strlen(l:before_line), col('.') - 2])
|
|
let l:idx = max([l:idx, 0])
|
|
let l:before_line = l:before_line[0 : l:idx]
|
|
|
|
if len(matchstr(l:before_line, s:get_keyword_pattern() . '$')) < 1
|
|
return
|
|
endif
|
|
|
|
|
|
call asyncomplete#complete(
|
|
\ a:opts.name,
|
|
\ a:ctx,
|
|
\ a:ctx.col - strlen(matchstr(a:ctx.typed, '\k*$')),
|
|
\ vsnip#get_complete_items(bufnr('%'))
|
|
\ )
|
|
endfunction
|
|
|
|
"
|
|
" get_keyword_pattern
|
|
"
|
|
function! s:get_keyword_pattern() abort
|
|
let l:keywords = split(&iskeyword, ',')
|
|
let l:keywords = filter(l:keywords, { _, k -> match(k, '\d\+-\d\+') == -1 })
|
|
let l:keywords = filter(l:keywords, { _, k -> k !=# '@' })
|
|
let l:pattern = '\%(' . join(map(l:keywords, { _, v -> '\V' . escape(v, '\') . '\m' }), '\|') . '\|\w\)*'
|
|
return l:pattern
|
|
endfunction
|
|
|