diff --git a/autoload/ale/completion.vim b/autoload/ale/completion.vim index 9f4e3c28..90c9ae29 100644 --- a/autoload/ale/completion.vim +++ b/autoload/ale/completion.vim @@ -283,6 +283,13 @@ function! s:TimerHandler(...) abort endfunction function! ale#completion#Queue() abort + let l:time = get(b:, 'ale_complete_done_time', 0) + + if l:time && ale#util#ClockMilliseconds() - l:time < 100 + " Do not ask for completions shortly after we just closed the menu. + return + endif + let s:timer_pos = getcurpos()[1:2] " If we changed the text again while we're still waiting for a response, @@ -311,6 +318,9 @@ function! ale#completion#Done() abort let &l:completeopt = b:ale_old_completopt unlet b:ale_old_completopt endif + + " Set a timestamp, so we can avoid requesting completions again. + let b:ale_complete_done_time = ale#util#ClockMilliseconds() endfunction function! s:Setup(enabled) abort diff --git a/test/test_completion.vader b/test/test_completion.vader index 811a2645..18e50f5b 100644 --- a/test/test_completion.vader +++ b/test/test_completion.vader @@ -13,6 +13,21 @@ Before: call add(g:test_vars.feedkeys_calls, [a:string, a:mode]) endfunction + function! CheckCompletionCalled(expect_success) abort + let g:test_vars.get_completions_called = 0 + + " We just want to check if the function is called. + function! ale#completion#GetCompletions() + let g:test_vars.get_completions_called = 1 + endfunction + + let g:ale_completion_delay = 0 + call ale#completion#Queue() + sleep 1m + + AssertEqual a:expect_success, g:test_vars.get_completions_called + endfunction + After: Restore @@ -22,6 +37,9 @@ After: unlet! b:ale_completion_info unlet! b:ale_completion_response unlet! b:ale_completion_parser + unlet! b:ale_complete_done_time + + delfunction CheckCompletionCalled runtime autoload/ale/completion.vim runtime autoload/ale/lsp.vim @@ -294,18 +312,7 @@ Execute(b:ale_completion_info should be set up correctly when requesting complet \ b:ale_completion_info Execute(ale#completion#GetCompletions should be called when the cursor position stays the same): - let g:test_vars.get_completions_called = 0 - - " We just want to check if the function is called. - function! ale#completion#GetCompletions() - let g:test_vars.get_completions_called = 1 - endfunction - - let g:ale_completion_delay = 0 - call ale#completion#Queue() - sleep 1m - - Assert g:test_vars.get_completions_called + call CheckCompletionCalled(1) Execute(ale#completion#GetCompletions should not be called when the cursor position changes): call setpos('.', [bufnr(''), 1, 2, 0]) @@ -326,3 +333,8 @@ Execute(ale#completion#GetCompletions should not be called when the cursor posit sleep 1m Assert !g:test_vars.get_completions_called + +Execute(Completion should not be done shortly after the CompleteDone function): + call CheckCompletionCalled(1) + call ale#completion#Done() + call CheckCompletionCalled(0)