It's a Fast and Minimalism Style Completion Plugin for vim/nvim.
Vim-easycomplete is a fast and minimalism style completion plugin for vim/nvim. It aims to be available out of the box on linux and mac.
It's extremely simple to configure without installing Node and a bunch of Node modules. For vim, it runs on vimscript for greater compatibility. For nvim, it runs on lua for better performance. On macOS, it includes a version written in Rust to improve performance. Thank nvim-cmp and coc.nvim. They inspired me a lot.

It contains these features:
- Compatible with vim and nvim.
- Full lsp support. Easy to install LSP Server with one command
- Keywords/path support. Snippet support. cmdline completion support.
- Fast performance based on rust.
- AI coding assistant via tabnine.
Requires Vim 8.2 or higher version on MacOS/Linux/FreeBSD. Neovim 0.7.0 or higher.
Lua config with Packer.nvim via require("easycomplete").config(opt)
:
use { 'jayli/vim-easycomplete', requires = {'L3MON4D3/LuaSnip'}}
-- For snippet support, 'SirVer/ultisnips' is an alternative option
-- `tabnine_enable = 0` alias `vim.g.easycomplete_tabnine_enable = 0`
require("easycomplete").config({
cmdline = 1,
pum_noselect = 0,
tabnine_enable = 0,
nerd_font = 1,
enable = 1,
winborder = 1,
ghost_text = 1,
menu_abbr = 0,
pum_format = {"abbr", "kind", "menu"},
setup = function()
vim.keymap.set('n', 'gr', ':EasyCompleteReference<CR>')
vim.keymap.set('n', 'gd', ':EasyCompleteGotoDefinition<CR>')
vim.keymap.set('n', 'rn', ':EasyCompleteRename<CR>')
-- Plugin has already bind shift-k to `:EasyCompleteHover`
-- vim.keymap.set('n', 'gh', ':EasyCompleteHover<CR>')
vim.keymap.set('n', 'gb', ':BackToOriginalBuffer<CR>')
end
})
Run :PackerInstall
You can configure it through global variables like this which is exactly the same as the above configuration:
-- lua
use { 'jayli/vim-easycomplete', requires = {'L3MON4D3/LuaSnip'}}
-- For snippet support, 'SirVer/ultisnips' is an alternative option
-- Tabnine aicoding support, default is 1
-- You should install tabnine first by ":InstallLspServer tabnine"
vim.g.easycomplete_tabnine_enable = 1
-- Tabnine coding suggestion, default is 0
vim.g.easycomplete_tabnine_suggestion = 0
-- Using nerdfont for lsp icons, default is 0
vim.g.easycomplete_nerd_font = 1
-- Add window border for pum, default is 1 (for nvim 0.11 or higher)
vim.g.easycomplete_winborder = 1
-- Pmenu format, default is {"abbr", "kind", "menu"}
vim.g.easycomplete_pum_format = {"kind", "abbr", "menu"}
-- Useful keymap
vim.keymap.set('n', 'gr', ':EasyCompleteReference<CR>')
vim.keymap.set('n', 'gd', ':EasyCompleteGotoDefinition<CR>')
vim.keymap.set('n', 'rn', ':EasyCompleteRename<CR>')
-- Plugin has already bind shift-k to `:EasyCompleteHover`
-- vim.keymap.set('n', 'gh', ':EasyCompleteHover<CR>')
vim.keymap.set('n', 'gb', ':BackToOriginalBuffer<CR>')
-- cmdline completion
vim.g.easycomplete_cmdline = 1
-- close pum keymap
-- vim.keymap.set('i', '<C-M>', '<Plug>EasycompleteClosePum')
-- Select next/previous pum items Keymap
-- vim.g.easycomplete_tab_trigger = "<C-J>"
-- vim.g.easycomplete_shift_tab_trigger = "<C-K>"
-- Redefine CR action
-- vim.g.easycomplete_use_default_cr = 0
-- vim.keymap.set('i', '<C-L>', '<Plug>EasycompleteCR')
Run :PackerInstall
Vimscript config with vim-plug:
" vim
Plug 'jayli/vim-easycomplete'
Plug 'L3MON4D3/LuaSnip' " 'SirVer/ultisnips' is a backup option
" Tabnine aicoding support, default is 1
" You should install tabnine first by ":InstallLspServer tabnine"
let g:easycomplete_tabnine_enable = 1
" Tabnine coding suggestion, default is 0
let g:easycomplete_tabnine_suggestion = 0
" Using nerdfont for lsp icons, default is 0
let g:easycomplete_nerd_font = 1
" Add window border for pum, default is 1 (for nvim 0.11 or higher)
let g:easycomplete_winborder = 1
" Pmenu format, default is ["abbr", "kind", "menu"]
let g:easycomplete_pum_format = ["kind", "abbr", "menu"]
" Useful keymap
noremap gr :EasyCompleteReference<CR>
noremap gd :EasyCompleteGotoDefinition<CR>
noremap rn :EasyCompleteRename<CR>
" Plugin has already bind shift-k to `:EasyCompleteHover`
" noremap gh :EasyCompleteHover<CR>
noremap gb :BackToOriginalBuffer<CR>
" cmdline completion
let g:easycomplete_cmdline = 1
" Close pum keymap
" inoremap <C-M> <Plug>EasycompleteClosePum
" Select Matched items Keymap
" let g:easycomplete_tab_trigger = "<C-J>"
" let g:easycomplete_shift_tab_trigger = "<C-K>"
" Redefine CR action
" let g:easycomplete_use_default_cr = 0
" inoremap <C-L> <Plug>EasycompleteCR
Run :PlugInstall
.
Tab
/S-Tab
: select next/previous matched items.Ctrl-]
: definition jumpingCtrl-t
: jumping back (Same as tags jumping).Ctrl-N
/Shift-Ctrl-N
: jump to the next/previous diagnostic position.Ctrl-E
: close complete menu.
Other optional configurations:
set updatetime=150
(lua:vim.opt.updatetime = 150
) is highly recommended.- Menu noselected by default:
setlocal completeopt+=noselect
, (lua:vim.cmd('setlocal completeopt+=noselect')
)
All commands:
Command | Description |
---|---|
:EasyCompleteInstallServer |
Install LSP server for current fileytpe |
:InstallLspServer |
Same as EasyCompleteInstallServer |
:EasyCompleteDisable |
Disable EasyComplete |
:EasyCompleteEnable |
Enable EasyComplete |
:EasyCompleteGotoDefinition |
Goto definition position |
:EasyCompleteReference |
Find references |
:EasyCompleteRename |
Rename |
:EasyCompleteHover |
Hover to get more information |
:EasyCompleteCheck |
Checking LSP server |
:EasyCompletePreviousDiagnostic |
Goto Previous diagnostic |
:EasyCompleteNextDiagnostic |
Goto Next diagnostic |
:EasyCompleteProfileStart |
Start record diagnostics message |
:EasyCompleteProfileStop |
Stop record diagnostics message |
:EasyCompleteLint |
Do diagnostic |
:LintEasyComplete |
Do diagnostic |
:BackToOriginalBuffer |
Return to the position before the reference jump |
:DenoCache |
Do Deno Cache for downloading modules |
:CleanLog |
close quickfix window |
Global configurations:
Global Configure | Default | Description |
---|---|---|
g:easycomplete_rust_enable |
1 | enable the rust high-performance mode on MacOS_x86 |
g:easycomplete_nerd_font |
0 | Using nerdfont for lsp icons |
g:easycomplete_menu_skin |
{} |
Menu skin. |
g:easycomplete_kind_icons |
{} |
Kind icons. |
g:easycomplete_sign_text |
{} |
Sign icons. |
g:easycomplete_lsp_type_font |
... | lsp icons configuration |
g:easycomplete_tabnine_suggestion |
0 | Tabnine inline suggestion(for nvim only) |
g:easycomplete_lsp_checking |
1 | Check whether the lsp is installed while opening a file |
g:easycomplete_lsp_server |
{} |
Set your custom lsp server for specific source |
g:easycomplete_tabnine_enable |
1 | Enable Tabnine |
g:easycomplete_path_enable |
1 | Path complete |
g:easycomplete_snips_enable |
1 | snippets complete |
g:easycomplete_tabnine_config |
{} |
TabNine Configuration |
g:easycomplete_filetypes |
{} |
Custom filetyps configuration |
g:easycomplete_enable |
1 | Enable this plugin |
g:easycomplete_tab_trigger |
<Tab> |
Use tab to trigger completion and select next item |
g:easycomplete_shift_tab_trigger |
<S-Tab> |
Use s-tab to select previous item |
g:easycomplete_cursor_word_hl |
0 | Highlight the symbol when holding the cursor |
g:easycomplete_signature_offset |
0 | Signature offset |
g:easycomplete_diagnostics_next |
<C-N> |
Goto next diagnostic position |
g:easycomplete_diagnostics_prev |
<S-C-n> |
Goto previous diagnostic position |
g:easycomplete_diagnostics_enable |
1 | Enable diagnostics |
g:easycomplete_signature_enable |
1 | Enable signature |
g:easycomplete_diagnostics_hover |
1 | Gives a diagnostic prompt when the cursor holds |
g:easycomplete_winborder |
1 | Add window border for pum (for nvim 0.11 or higher) |
g:easycomplete_pum_border_style |
"rounded" |
Pum window border style |
g:easycomplete_info_border_style |
"single" |
More info window border style |
g:easycomplete_ghost_text |
1 | Ghost text |
g:easycomplete_pum_maxheight |
20 | Pum window max height |
g:easycomplete_pum_fix_width |
0 | Pum fix width or not |
g:easycomplete_pum_format |
["abbr", "kind", "menu"] |
Pmenu format |
g:easycomplete_menu_abbr |
0 | Show abbr(shortname) at pum menu position, or show fullname |
g:easycomplete_custom_snippet |
"" |
Custom snippets path |
g:easycomplete_use_default_cr |
1 | enable or disable default cr action |
g:easycomplete_pum_pretty_style |
1 | Adjust the pum style with border automatically |
g:easycomplete_cmdline |
1 | Commandline complete |
g:easycomplete_pum_maxlength |
31 | Max length of mathing word in pum list |
g:easycomplete_pum_noselect |
0 | Autoselect first matched item or not. Same as set &completeopt+=noselect |
Typing :h easycomplete
for help.
There are tow ways to install lsp server.
- vim/nvim: Via command
:InstallLspServer
. - nvim: Via mason.nvim, Do
:MasonInstall {lsp-server-name}
LSP Server will all be installed in local path: ~/.config/vim-easycomplete/servers
.
InstallLspServer
command: Both of the following useage are ok:
:InstallLspServer
:InstallLspServer lua
All supported languages:
Plugin Name | Languages | Language Server | Installer | Requirements | URL |
---|---|---|---|---|---|
path | path | No Need | Integrated | None | |
buf | buf & dict | No Need | Integrated | None | |
snips | Snippets | ultisnips/LuaSnip | Integrated | python3/lua | |
ts | js/ts | tsserver | Yes | node/npm | |
deno | js/ts | denols | Yes | deno | |
tn | TabNine | TabNine | Yes | None | |
vim | Vim | vimls | Yes | node/npm | |
cpp | C/C++/OC | clangd | Yes | None | |
css | CSS | cssls | Yes | node/npm | |
html | HTML | html | Yes | node/npm | |
yml | YAML | yamlls | Yes | node/npm | |
xml | Xml | lemminx | Yes | java/jdk | |
sh | Bash | bashls | Yes | node/npm | |
json | JSON | json-languageserver | Yes | node/npm | |
php | php | intelephense | Yes | node/npm | |
dart | dart | dartls | Yes | None | |
py | Python | pylsp | Yes | python3/pip3 | |
java | Java | jdtls | Yes | java11/jdk | |
go | Go | gopls | Yes | go | |
r | R | r-languageserver | Yes | R | |
rb | Ruby | solargraph | Yes | ruby/bundle | |
lua | Lua | sumneko_lua |
Yes | Lua | |
nim | Nim | nimls | Yes | nim/nimble | |
rust | Rust | rust_analyzer |
Yes | None | |
kt | Kotlin | kotlin_language_server |
Yes | java/jdk | |
grvy | Groovy | groovyls | Yes | java/jdk | |
cmake | cmake | cmake | Yes | python3/pip3 | |
c# | C# | omnisharp-lsp | Yes | None | |
zig | zig | zls | Yes | zig | |
docker | docker | dockerfile-language-server | Mason | node/npm | easycomplete-docker |
More info about supported language:
- JavaScript & TypeScript: tsserver required.
- Python: There are 2 avilable python-language-server branches:
- pyls support python 3.5 ~ 3.10 (pyls breaks autocomplete on Python 3.11),
pip3 install python-language-server
- pylsp work well with python 3.11,
pip3 install python-lsp-server
, (Recommend)
- pyls support python 3.5 ~ 3.10 (pyls breaks autocomplete on Python 3.11),
- Go: gopls required. (
go get golang.org/x/tools/gopls
) - Vim Script: vimls required.
- C++/C/OC:Clangd required.
- CSS: cssls required. (css-languageserver),Css-languageserver dose not support CompletionProvider by default as it requires Snippets,You must install it manually.
- JSON: json-languageserver required.
- PHP: intelephense
- Dart: dartls
- HTML: html required. html-languageserver dose not support CompletionProvider by default. You must install Snippets manually.
- Shell: bashls required.
- Java: jdtls, java 11 and upper version required.
- Cmake: cmake required.
- Kotlin: kotlin language server required.
- Rust: rust-analyzer required. Please use mason to install
rust-analyzer
. - Lua: sumneko lua required. Local configuration file path is
~/.config/vim-easycomplete/servers/lua/config.json
. Get more information here. - Xml: lemminx required.
- Groovy: groovyls required.
- Yaml: yamlls required.
- Ruby: solargraph required.
- Nim: nimlsp required. packages.json downloading is very slow, You'd better intall minlsp manually via
choosenim
follow this guide. - Deno: denols required. Use
:DenoCache
command fordeno cache
current ts/js file. - C# : omnisharp required.
- R: r-languageserver required.
- zig: zls required.
- docker: install plugin easycomplete-docker, dockerfile-language-server required.
- TabNine: TabNine
You can add filetypes whitelist for specified language plugin. In most cases, it is not necessary to do so:
vimscript
" vim
let g:easycomplete_filetypes = {
\ "sh": {
\ "whitelist": ["shell"]
\ },
\ "r": {
\ "whitelist": ["rmd", "rmarkdown"]
\ },
\ }
luascript
-- lua
vim.g.easycomplete_filetypes = {
sh = {
whitelist = {"shell"}
},
r = {
whitelist = {"rmd", "rmarkdown"}
}
}
The snippet completion of Vim-EasyComplete relies on ultisnip or luasnip. They are both compatible with Vim-EasyComplete by simply place it in the dependent field. UltiSnips required python3 installed. You can use your own snippets path to replace the default snippets.
vimscript
" vim
let g:easycomplete_custom_snippet = "./path/to/your/snippets"
luascript
-- lua
vim.g.easycomplete_custom_snippet = "./path/to/your/snippets"
You can alse add your own snippet directory to &runtimepath
.
LuaSnip is better choice for nvim.
In addition to AI completion with pum, there are more inline AI coding completion tools.
Vim-easycomplete integrates Tabnine already. Install TabNine: :InstallLspServer tabnine
.
Config TabNine via g:easycomplete_tabnine_config
witch contains two properties:
- line_limit: The number of lines before and after the cursor to send to TabNine. If the option is smaller, the performance may be improved. (default: 1000)
- max_num_result: Max results from TabNine showing in the complete menu. (default: 3)
vimscript
" vim
let g:easycomplete_tabnine_config = {
\ 'line_limit': 1000,
\ 'max_num_result' : 3,
\ }
luascript
-- lua
vim.g.easycomplete_tabnine_config = {
line_limit = 1000,
max_num_result = 3
}
TabNine works well without APIKey. If you have a Tabnine's Pro API key or purchased a subscription license. To configure, you'll need to use the TabNine' magic string (Type Tabnine::config
in insert mode) to open the configuration panel.
Enable TabNine inline suggestion: let g:easycomplete_tabnine_suggestion = 1
.
2) copilot.nvim
Copilot.nvim plugin is a better choice. Vim-easycomplete is working well with copilot.nvim.
If you are an Alibaba engineer, then aone copilot is the best choice. You can find configuration guideline based on copilot.nvim on ATA.
Set g:easycomplete_nerd_font = 1
to enable default nerdfonts configuration.
If you want to customize the kind icon, you can modify the configuration with https://nerdfonts.com installed. Examples.
You can add custom Pmenu styles by defining these highlight groups:
In most cases, you don't need to do so.
EasyFuzzyMatch
: highlight fuzzy matching character. It links to "PmenuMatch" by default.EasyPmenu
: Pmenu style. It links to "Pmenu" by default.EasyPmenuKind
: PmenuKind style. It links to "PmenuKind" by default.EasyPmenuExtra
: PmenuExtra style. It links to "PmenuExtra" by default.EasyFunction
: Function kind icon style. links to "Conditional" by default.EasySnippet
: Snippet kind icon style. links to "Keyword" by default.EasyTabNine
: TabNine kind icon style. links to "Character" by default.EasySnippets
: TabNine snippets suggestion style. links to "LineNr" by defaultEasyNormal
: Pmenu default style. links to "Normal" by default.EasyKeyword
: Pmenu keyword kind icon style. links to "Define" by default.EasyModule
: Module kind icon style. links to "Function" by default.
When g:easycomplete_winborder
is set to 1
. The guibg of Pmenu will be set to be the same as the Normal guibg automatically. If you want to redefine pum style, disable the auto setting by let g:easycomplete_pum_pretty_style = 0
. Then define these highlight group: "FloatBorder, Pmenu, PmenuExtra, PmenuKind" etc.
More examples here: full config example
MIT