From 8451a8353b51efaa40540f3794109642cf9b7b04 Mon Sep 17 00:00:00 2001 From: Prabir Shrestha Date: Sun, 10 Feb 2019 18:11:30 -0800 Subject: [PATCH] add s:get_active_sources_for_buffer() --- autoload/asyncomplete.vim | 73 ++++++++++++++++++++++++++++++++++----- 1 file changed, 65 insertions(+), 8 deletions(-) diff --git a/autoload/asyncomplete.vim b/autoload/asyncomplete.vim index 5e866ec..bd819d2 100644 --- a/autoload/asyncomplete.vim +++ b/autoload/asyncomplete.vim @@ -22,27 +22,33 @@ endfunction function! s:setup_if_required() abort if !s:already_setup " register asyncomplete manager - call asyncomplete#log('initializing asyncomplete manager', g:asyncomplete_manager) + call asyncomplete#log('core', 'initializing asyncomplete manager', g:asyncomplete_manager) execute 'let s:manager = function("'. g:asyncomplete_manager .'")()' - call asyncomplete#log('initializing asyncomplete manager complete', s:manager['name']) + call asyncomplete#log('core', 'initializing asyncomplete manager complete', s:manager['name']) " register asyncomplete change manager for l:change_manager in g:asyncomplete_change_manager - call asyncomplete#log('initializing asyncomplete change manager', l:change_manager) + call asyncomplete#log('core', 'initializing asyncomplete change manager', l:change_manager) if type(l:change_manager) == type('') execute 'let s:on_change_manager = function("'. l:change_manager .'")()' else let s:on_change_manager = l:change_manager() endif if has_key(s:on_change_manager, 'error') - call asyncomplete#log('initializing asyncomplete change manager failed', s:on_change_manager['name'], s:on_change_manager['error']) + call asyncomplete#log('core', 'initializing asyncomplete change manager failed', s:on_change_manager['name'], s:on_change_manager['error']) else call s:on_change_manager.register(function('s:on_change')) - call asyncomplete#log('initializing asyncomplete change manager complete', s:on_change_manager['name']) + call asyncomplete#log('core', 'initializing asyncomplete change manager complete', s:on_change_manager['name']) break endif endfor + augroup asyncomplete + autocmd! + autocmd InsertEnter * call s:on_insert_enter() + autocmd InsertLeave * call s:on_insert_leave() + augroup END + doautocmd User asyncomplete_setup let s:already_setup = 1 endif @@ -59,7 +65,7 @@ endfunction function! asyncomplete#register_source(info) abort if has_key(s:sources, a:info['name']) - call asyncomplete#log('duplicate asyncomplete#register_source', a:info['name']) + call asyncomplete#log('core', 'duplicate asyncomplete#register_source', a:info['name']) return -1 else let s:sources[a:info['name']] = a:info @@ -85,6 +91,57 @@ function! asyncomplete#unregister_source(info_or_server_name) abort endif endfunction -function! s:on_change() abort - call asyncomplete#log('on_change', getline('.'), getcurpos()) +function! s:on_insert_enter() abort + call s:get_active_sources_for_buffer() " call to cache +endfunction + +function! s:on_insert_leave() abort + let s:active_source_names = [] +endfunction + +function! s:on_change() abort + if mode() isnot# 'i' + return + endif + + call asyncomplete#log('core', 'on_change', getline('.'), getcurpos()) +endfunction + +function! s:get_active_sources_for_buffer() abort + if exists('b:asyncomplete_active_sources') + " active sources were cached for buffer + return b:asyncomplete_active_sources + endif + + call asyncomplete#log('core', 'computing active sources for buffer', bufnr('%')) + let b:asyncomplete_active_sources = [] + for [l:name, l:info] in items(s:sources) + let l:blacklisted = 0 + + if has_key(l:info, 'blacklist') + for l:filetype in l:info['blacklist'] + if l:filetype == &filetype || l:filetype is# '*' + let l:blacklisted = 1 + break + endif + endfor + endif + + if l:blacklisted + continue + endif + + if has_key(l:info, 'whitelist') + for l:filetype in l:info['whitelist'] + if l:filetype == &filetype || l:filetype is# '*' + let b:asyncomplete_active_sources += [l:name] + break + endif + endfor + endif + endfor + + call asyncomplete#log('core', 'active source for buffer', bufnr('%'), b:asyncomplete_active_sources) + + return b:asyncomplete_active_sources endfunction