Skip to content

Commit

Permalink
#1700 - Try using a 0ms timer showing the completion menu
Browse files Browse the repository at this point in the history
  • Loading branch information
w0rp committed Jul 26, 2018
1 parent f8e61ff commit daab1a0
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 15 deletions.
14 changes: 5 additions & 9 deletions autoload/ale/completion.vim
@@ -1,17 +1,10 @@
" Author: w0rp <devw0rp@gmail.com>
" Description: Completion support for LSP linters

function! ale#completion#TriggerOmnicompleteMenu() abort
" Replace completion options shortly before opening the menu.
call s:ReplaceCompletionOptions()

return "\<C-x>\<C-o>"
endfunction

" The omnicompletion menu is shown through a special Plug mapping which is
" only valid in Insert mode. This way, feedkeys() won't send these keys if you
" quit Insert mode quickly enough.
inoremap <silent> <Plug>(ale_show_completion_menu) <C-R>=ale#completion#TriggerOmnicompleteMenu()<CR>
inoremap <silent> <Plug>(ale_show_completion_menu) <C-x><C-o>
" If we hit the key sequence in normal mode, then we won't show the menu, so
" we should restore the old settings right away.
nnoremap <silent> <Plug>(ale_show_completion_menu) :call ale#completion#RestoreCompletionOptions()<CR>
Expand Down Expand Up @@ -221,7 +214,10 @@ function! ale#completion#Show(response, completion_parser) abort
" function, and then start omni-completion.
let b:ale_completion_response = a:response
let b:ale_completion_parser = a:completion_parser
call ale#util#FeedKeys("\<Plug>(ale_show_completion_menu)")
" Replace completion options shortly before opening the menu.
call s:ReplaceCompletionOptions()

call timer_start(0, {-> ale#util#FeedKeys("\<Plug>(ale_show_completion_menu)")})
endfunction

function! s:CompletionStillValid(request_id) abort
Expand Down
20 changes: 14 additions & 6 deletions test/completion/test_completion_events.vader
Expand Up @@ -125,32 +125,38 @@ Execute(ale#completion#Show() should remember the omnifunc setting and replace i
let &l:omnifunc = 'FooBar'

call ale#completion#Show('Response', 'Parser')
AssertEqual [["\<Plug>(ale_show_completion_menu)"]], g:feedkeys_calls
call ale#completion#TriggerOmnicompleteMenu()

AssertEqual 'FooBar', b:ale_old_omnifunc
AssertEqual 'ale#completion#OmniFunc', &l:omnifunc

AssertEqual [], g:feedkeys_calls
sleep 1ms
AssertEqual [["\<Plug>(ale_show_completion_menu)"]], g:feedkeys_calls

Execute(ale#completion#Show() should remember the completeopt setting and replace it):
let &l:completeopt = 'menu'

call ale#completion#Show('Response', 'Parser')
AssertEqual [["\<Plug>(ale_show_completion_menu)"]], g:feedkeys_calls
call ale#completion#TriggerOmnicompleteMenu()

AssertEqual 'menu', b:ale_old_completopt
AssertEqual 'menu,menuone,noselect,noinsert', &l:completeopt

AssertEqual [], g:feedkeys_calls
sleep 1ms
AssertEqual [["\<Plug>(ale_show_completion_menu)"]], g:feedkeys_calls

Execute(ale#completion#Show() should set the preview option if it's set):
let &l:completeopt = 'menu,preview'

call ale#completion#Show('Response', 'Parser')
AssertEqual [["\<Plug>(ale_show_completion_menu)"]], g:feedkeys_calls
call ale#completion#TriggerOmnicompleteMenu()

AssertEqual 'menu,preview', b:ale_old_completopt
AssertEqual 'menu,menuone,preview,noselect,noinsert', &l:completeopt

AssertEqual [], g:feedkeys_calls
sleep 1ms
AssertEqual [["\<Plug>(ale_show_completion_menu)"]], g:feedkeys_calls

Execute(ale#completion#OmniFunc() should also remember the completeopt setting and replace it):
let &l:completeopt = 'menu'

Expand All @@ -170,6 +176,8 @@ Execute(ale#completion#OmniFunc() should set the preview option if it's set):
Execute(ale#completion#Show() should make the correct feedkeys() call):
call ale#completion#Show('Response', 'Parser')

AssertEqual [], g:feedkeys_calls
sleep 1ms
AssertEqual [["\<Plug>(ale_show_completion_menu)"]], g:feedkeys_calls

Execute(ale#completion#Show() shouldn't do anything if you switch back to normal mode):
Expand Down

0 comments on commit daab1a0

Please sign in to comment.