Provide async autocompletion for vim8 and neovim with timers
.
This repository is fork of https://github.com/roxma/nvim-complete-manager
in pure vim script with python dependency removed.
Plug 'prabirshrestha/asyncomplete.vim'
inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
inoremap <expr> <cr> pumvisible() ? "\<C-y>\<cr>" : "\<cr>"
imap <c-space> <Plug>(asyncomplete_force_refresh)
By default asyncomplete will automatically show the autocomplete popup menu as you start typing.
If you would like to disable the default behvior set g:asyncomplete_auto_popup
to 0.
let g:asyncomplete_auto_popup = 0
You can use the above <Plug>(asyncomplete_force_refresh)
to show the popup
or can you tab to show the autocomplete.
let g:asyncomplete_auto_popup = 0
function! s:check_back_space() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~ '\s'
endfunction
inoremap <silent><expr> <TAB>
\ pumvisible() ? "\<C-n>" :
\ <SID>check_back_space() ? "\<TAB>" :
\ asyncomplete#force_refresh()
inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"
To disable preview window:
set completeop-=preview
To enable preview window:
set completeopt+=preview
To auto close preview window when completion is done.
autocmd! CompleteDone * if pumvisible() == 0 | pclose | endif
asyncomplete.vim deliberately does not contain any sources. Please use one of the following sources or create your own.
- Buffer via asyncomplete-buffer.vim
- Vim Syntax via asyncomplete-necosyntax.vim
- Go via asyncomplete-gocode.vim
- Neosnippet via asyncomplete-neosnippet.vim
- UltiSnips via asyncomplete-ultisnips.vim
- JavaScript (Flow) via asyncomplete-flow.vim
- Typescript via asyncomplete-tscompletejob.vim
- can't find what you are looking for? write one instead an send a PR to be included here
function! s:js_completor(opt, ctx) abort
let l:col = a:ctx['col']
let l:typed = a:ctx['typed']
let l:kw = matchstr(l:typed, '\v\S+$')
let l:kwlen = len(l:kw)
let l:startcol = l:col - l:kwlen
let l:matches = [
\ "do", "if", "in", "for", "let", "new", "try", "var", "case", "else", "enum", "eval", "null", "this", "true",
\ "void", "with", "await", "break", "catch", "class", "const", "false", "super", "throw", "while", "yield",
\ "delete", "export", "import", "public", "return", "static", "switch", "typeof", "default", "extends",
\ "finally", "package", "private", "continue", "debugger", "function", "arguments", "interface", "protected",
\ "implements", "instanceof"
\ ]
call asyncomplete#complete(a:opt['name'], a:ctx, l:startcol, l:matches)
endfunction
call asyncomplete#register_source({
\ 'name': 'javascript',
\ 'whitelist': ['javascript'],
\ 'completor': function('s:js_completor'),
\ })
The above sample shows synchronous completion. If you would like to make it async just call asyncomplete#complete
whenever you have the results ready.
call timer_start(2000, {timer-> asyncomplete#complete(a:opt['name'], a:ctx, l:startcol, l:matches)})
If you are returning incomplete results and would like to trigger completion on the next keypress pass 1
as the fifth parameter to asyncomplete#complete
which signifies the result is incomplete.
call asyncomplete#complete(a:opt['name'], a:ctx, l:startcol, l:matches, 1)
As a source author you do not have to worry about synchronization issues in case the server returns the async completion after the user has typed more
characters. asyncomplete.vim uses partial caching as well as ignores if the context changes when calling asyncomplete#complete
.
This is one of the core reason why the original context must be passed when calling asyncomplete#complete
.
All the credit goes to the following projects