Add asyncomplete.vim Support (#2627)

This commit is contained in:
Donnie West 2019-08-17 12:40:05 -05:00 committed by w0rp
parent 28c93ab185
commit 5388ff1d54
4 changed files with 90 additions and 3 deletions

View file

@ -267,6 +267,14 @@ function! ale#completion#Show(result) abort
\ {-> ale#util#FeedKeys("\<Plug>(ale_show_completion_menu)")} \ {-> ale#util#FeedKeys("\<Plug>(ale_show_completion_menu)")}
\) \)
endif endif
if l:source is# 'ale-callback'
call b:CompleteCallback(b:ale_completion_result)
endif
endfunction
function! ale#completion#GetAllTriggers() abort
return deepcopy(s:trigger_character_map)
endfunction endfunction
function! s:CompletionStillValid(request_id) abort function! s:CompletionStillValid(request_id) abort
@ -280,6 +288,7 @@ function! s:CompletionStillValid(request_id) abort
\ b:ale_completion_info.column == l:column \ b:ale_completion_info.column == l:column
\ || b:ale_completion_info.source is# 'deoplete' \ || b:ale_completion_info.source is# 'deoplete'
\ || b:ale_completion_info.source is# 'ale-omnifunc' \ || b:ale_completion_info.source is# 'ale-omnifunc'
\ || b:ale_completion_info.source is# 'ale-callback'
\) \)
endfunction endfunction
@ -560,12 +569,25 @@ endfunction
" This function can be used to manually trigger autocomplete, even when " This function can be used to manually trigger autocomplete, even when
" g:ale_completion_enabled is set to false " g:ale_completion_enabled is set to false
function! ale#completion#GetCompletions(source) abort function! ale#completion#GetCompletions(...) abort
let l:source = get(a:000, 0, '')
let l:options = get(a:000, 1, {})
if len(a:000) > 2
throw 'Too many arguments!'
endif
let l:CompleteCallback = get(l:options, 'callback', v:null)
if l:CompleteCallback isnot v:null
let b:CompleteCallback = l:CompleteCallback
endif
let [l:line, l:column] = getpos('.')[1:2] let [l:line, l:column] = getpos('.')[1:2]
let l:prefix = ale#completion#GetPrefix(&filetype, l:line, l:column) let l:prefix = ale#completion#GetPrefix(&filetype, l:line, l:column)
if a:source is# 'ale-automatic' && empty(l:prefix) if l:source is# 'ale-automatic' && empty(l:prefix)
return 0 return 0
endif endif
@ -578,7 +600,7 @@ function! ale#completion#GetCompletions(source) abort
\ 'prefix': l:prefix, \ 'prefix': l:prefix,
\ 'conn_id': 0, \ 'conn_id': 0,
\ 'request_id': 0, \ 'request_id': 0,
\ 'source': a:source, \ 'source': l:source,
\} \}
unlet! b:ale_completion_result unlet! b:ale_completion_result

View file

@ -0,0 +1,26 @@
function! asyncomplete#sources#ale#get_source_options(...) abort
let l:default = extend({
\ 'name': 'ale',
\ 'completor': function('asyncomplete#sources#ale#completor'),
\ 'whitelist': ['*'],
\ 'triggers': asyncomplete#sources#ale#get_triggers(),
\ }, a:0 >= 1 ? a:1 : {})
return extend(l:default, {'refresh_pattern': '\k\+$'})
endfunction
function! asyncomplete#sources#ale#get_triggers() abort
let l:triggers = ale#completion#GetAllTriggers()
let l:triggers['*'] = l:triggers['<default>']
return l:triggers
endfunction
function! asyncomplete#sources#ale#completor(options, context) abort
let l:keyword = matchstr(a:context.typed, '\w\+$')
let l:startcol = a:context.col - len(l:keyword)
call ale#completion#GetCompletions('ale-callback', { 'callback': {completions ->
\ asyncomplete#complete(a:options.name, a:context, l:startcol, completions)
\ }})
endfunction

View file

@ -341,6 +341,17 @@ completion source for Deoplete is named `'ale'`, and should enabled
automatically if Deoplete is enabled and configured correctly. Deoplete automatically if Deoplete is enabled and configured correctly. Deoplete
integration should not be combined with ALE's own implementation. integration should not be combined with ALE's own implementation.
*ale-asyncomplete-integration*
ALE additionally integrates with asyncomplete.vim for offering automatic
completion data. ALE's asyncomplete source requires registration and should
use the defaults provided by the|asyncomplete#sources#ale#get_source_options| function >
" Use ALE's function for asyncomplete defaults
au User asyncomplete_setup call asyncomplete#register_source(asyncomplete#sources#ale#get_source_options({
\ 'priority': 10, " Provide your own overrides here
\ }))
>
ALE also offers its own completion implementation, which does not require any ALE also offers its own completion implementation, which does not require any
other plugins. Suggestions will be made while you type after completion is other plugins. Suggestions will be made while you type after completion is
enabled. ALE's own completion implementation can be enabled by setting enabled. ALE's own completion implementation can be enabled by setting

View file

@ -62,6 +62,10 @@ After:
delfunction CheckCompletionCalled delfunction CheckCompletionCalled
if exists('*CompleteCallback')
delfunction CompleteCallback
endif
" Stop any timers we left behind. " Stop any timers we left behind.
" This stops the tests from failing randomly. " This stops the tests from failing randomly.
call ale#completion#StopTimer() call ale#completion#StopTimer()
@ -333,6 +337,30 @@ Execute(b:ale_completion_info should be set up correctly for other sources):
\ b:ale_completion_info \ b:ale_completion_info
Assert !exists('b:ale_completion_result') Assert !exists('b:ale_completion_result')
Execute(b:ale_completion_info should be set up correctly when requesting completions via callback):
let b:ale_completion_result = []
call setpos('.', [bufnr(''), 3, 14, 0])
function! CompleteCallback() abort
echo 'Called'
endfunction
call ale#completion#GetCompletions('ale-callback', {'callback': funcref('CompleteCallback')})
AssertEqual
\ {
\ 'request_id': 0,
\ 'conn_id': 0,
\ 'column': 14,
\ 'line_length': 14,
\ 'line': 3,
\ 'prefix': 'ab',
\ 'source': 'ale-callback',
\ },
\ b:ale_completion_info
Assert !exists('b:ale_completion_result')
Execute(The correct keybinds should be configured): Execute(The correct keybinds should be configured):
redir => g:output redir => g:output
silent map <Plug>(ale_show_completion_menu) silent map <Plug>(ale_show_completion_menu)