Add asyncomplete.vim Support (#2627)
This commit is contained in:
parent
28c93ab185
commit
5388ff1d54
4 changed files with 90 additions and 3 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
26
autoload/asyncomplete/sources/ale.vim
Normal file
26
autoload/asyncomplete/sources/ale.vim
Normal 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
|
11
doc/ale.txt
11
doc/ale.txt
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Reference in a new issue