All Projects → prabirshrestha → Asyncomplete.vim

prabirshrestha / Asyncomplete.vim

Licence: mit
async completion in pure vim script for vim8 and neovim

Projects that are alternatives of or similar to Asyncomplete.vim

Alchemist.vim
Elixir Integration Into Vim
Stars: ✭ 632 (-3.36%)
Mutual labels:  code-completion, neovim
Nvim Typescript
Typescript tooling for Neovim
Stars: ✭ 609 (-6.88%)
Mutual labels:  neovim
Vim Lsc
A vim plugin for communicating with a language server
Stars: ✭ 545 (-16.67%)
Mutual labels:  neovim
Conjure
Interactive evaluation for Neovim (Clojure, Fennel, Janet, Racket, Hy, MIT Scheme, Guile)
Stars: ✭ 569 (-13%)
Mutual labels:  neovim
Coc Snippets
Snippets solution for coc.nvim
Stars: ✭ 547 (-16.36%)
Mutual labels:  neovim
Vimr
Project VimR is a Neovim GUI for macOS. The goal is to build an editor that uses Neovim inside with many of the convenience GUI features similar to those present in modern editors. We mainly use Swift, but also use C/Objective-C when where appropriate.
Stars: ✭ 5,524 (+744.65%)
Mutual labels:  neovim
Coc Python
Python extension for coc.nvim, fork of vscode-python
Stars: ✭ 542 (-17.13%)
Mutual labels:  neovim
Dotfiles
Zsh, Karabiner, VS Code, Sublime, Neovim, Nix
Stars: ✭ 634 (-3.06%)
Mutual labels:  neovim
Coc Tsserver
Tsserver extension for coc.nvim that provide rich features like VSCode for javascript & typescript
Stars: ✭ 602 (-7.95%)
Mutual labels:  neovim
Tagbar
Vim plugin that displays tags in a window, ordered by scope
Stars: ✭ 5,322 (+713.76%)
Mutual labels:  neovim
Evervim
A Modern, Powerful & Modular Vim Distribution
Stars: ✭ 568 (-13.15%)
Mutual labels:  neovim
Fern.vim
🌿 General purpose asynchronous tree viewer written in Pure Vim script
Stars: ✭ 552 (-15.6%)
Mutual labels:  neovim
Gina.vim
👣 Asynchronously control git repositories in Neovim/Vim 8
Stars: ✭ 587 (-10.24%)
Mutual labels:  neovim
Youcompleteme
A code-completion engine for Vim
Stars: ✭ 23,518 (+3496.02%)
Mutual labels:  code-completion
Jarvis
Dotfiles for a powerful, web development-focused environment powered by Neovim, iTerm2, tmux, and zsh
Stars: ✭ 617 (-5.66%)
Mutual labels:  neovim
Comfortable Motion.vim
Brings physics-based smooth scrolling to the Vim world!
Stars: ✭ 543 (-16.97%)
Mutual labels:  neovim
Vim Smoothie
Smooth scrolling for Vim done right🥤
Stars: ✭ 579 (-11.47%)
Mutual labels:  neovim
Chadtree
File manager for Neovim. Better than NERDTree.
Stars: ✭ 653 (-0.15%)
Mutual labels:  neovim
Fzf Preview.vim
The plugin that powerfully integrates fzf and (Neo)vim. It is also possible to integrate with coc.nvim.
Stars: ✭ 563 (-13.91%)
Mutual labels:  neovim
Neovim Dots
most beautiful neovim cli setup
Stars: ✭ 547 (-16.36%)
Mutual labels:  neovim

asyncomplete.vim

Async autocompletion for Vim 8 and Neovim with |timers|.

This is inspired by nvim-complete-manager but written in pure Vim Script.

Installing

Plug 'prabirshrestha/asyncomplete.vim'

Tab completion

inoremap <expr> <Tab>   pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
inoremap <expr> <cr>    pumvisible() ? asyncomplete#close_popup() : "\<cr>"

If you prefer the enter key to always insert a new line (even if the popup menu is visible) then you can amend the above mapping as follows:

inoremap <expr> <cr> pumvisible() ? asyncomplete#close_popup() . "\<cr>" : "\<cr>"

Force refresh completion

imap <c-space> <Plug>(asyncomplete_force_refresh)

Auto popup

By default asyncomplete will automatically show the autocomplete popup menu as you start typing. If you would like to disable the default behavior 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 you can 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>"

Preview Window

To enable preview window:

" allow modifying the completeopt variable, or it will
" be overridden all the time
let g:asyncomplete_auto_completeopt = 0

set completeopt=menuone,noinsert,noselect,preview

To auto close preview window when completion is done.

autocmd! CompleteDone * if pumvisible() == 0 | pclose | endif

Sources

asyncomplete.vim deliberately does not contain any sources. Please use one of the following sources or create your own.

Language Server Protocol (LSP)

Language Server Protocol via vim-lsp and asyncomplete-lsp.vim

Please note that vim-lsp setup for neovim requires neovim v0.2.0 or higher, since it uses lambda setup.

Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/vim-lsp'
Plug 'prabirshrestha/asyncomplete-lsp.vim'

if executable('pyls')
    " pip install python-language-server
    au User lsp_setup call lsp#register_server({
        \ 'name': 'pyls',
        \ 'cmd': {server_info->['pyls']},
        \ 'allowlist': ['python'],
        \ })
endif

Refer to vim-lsp wiki for configuring other language servers. Besides auto-complete language server support other features such as go to definition, find references, renaming symbols, document symbols, find workspace symbols, formatting and so on.

in alphabetical order

Languages/FileType/Source Links
Ale asyncomplete-ale.vim
Buffer asyncomplete-buffer.vim
C/C++ asyncomplete-clang.vim
Clojure async-clj-omni
Common Lisp (vlime) vlime
Dictionary (look) asyncomplete-look
Emmet asyncomplete-emmet.vim
English asyncomplete-nextword.vim
Emoji asyncomplete-emoji.vim
Filenames / directories asyncomplete-file.vim
NeoInclude asyncomplete-neoinclude.vim
Go asyncomplete-gocode.vim
Git commit message asyncomplete-gitcommit
JavaScript (Flow) asyncomplete-flow.vim
Neosnippet asyncomplete-neosnippet.vim
Omni asyncomplete-omni.vim
PivotalTracker stories asyncomplete-pivotaltracker.vim
Rust (racer) asyncomplete-racer.vim
TabNine powered by AI asyncomplete-tabnine.vim
tmux complete tmux-complete.vim
Typescript asyncomplete-tscompletejob.vim
UltiSnips asyncomplete-ultisnips.vim
User (compl-function) asyncomplete-user.vim
Vim Syntax asyncomplete-necosyntax.vim
Vim tags asyncomplete-tags.vim
Vim asyncomplete-necovim.vim

can't find what you are looking for? write one instead an send a PR to be included here or search github topics tagged with asyncomplete at https://github.com/topics/asyncomplete.

Using existing vim plugin sources

Rather than writing your own completion source from scratch you could also suggests other plugin authors to provide a async completion api that works for asyncomplete.vim or any other async autocomplete libraries without taking a dependency on asyncomplete.vim. The plugin can provide a function that takes a callback which returns the list of candidates and the startcol from where it must show the popup. Candidates can be list of words or vim's complete-items.

function s:completor(opt, ctx)
  call mylanguage#get_async_completions({candidates, startcol -> asyncomplete#complete(a:opt['name'], a:ctx, startcol, candidates) })
endfunction

au User asyncomplete_setup call asyncomplete#register_source({
    \ 'name': 'mylanguage',
    \ 'allowlist': ['*'],
    \ 'completor': function('s:completor'),
    \ })

Example

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

au User asyncomplete_setup call asyncomplete#register_source({
    \ 'name': 'javascript',
    \ 'allowlist': ['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.

Credits

All the credit goes to the following projects

Contributors

Code Contributors

This project exists thanks to all the people who contribute. [Contribute].

Financial Contributors

Become a financial contributor and help us sustain our community. [Contribute]

Individuals

Organizations

Support this project with your organization. Your logo will show up here with a link to your website. [Contribute]

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].