Skip to content

jayli/vim-easycomplete

Repository files navigation

Vim-EasyComplete

中文 | English

It's a Fast and Minimalism Style Completion Plugin for vim/nvim.

What

Vim-easycomplete is a fast and minimalism style completion plugin for both vim and nvim. It aims to be available out of the box on linux and mac. It is implemented in pure VimScript and is extremely simple to configure without installing Node and a bunch of Node modules. Thank nvim-cmp and coc.nvim. They inspired me a lot.

vim-easycomplete.mov

It contains these features:

  • Full lsp support. Easy to install LSP Server with one command
  • Keywords/Directory support
  • Implemented based on pure vimscript
  • Snippet support.
  • Fast performance
  • AI coding assistant via tabnine.

Installation

Requires Vim 8.2 or higher version on MacOS/Linux/FreeBSD. Neovim 0.7.0 or higher.

Lua config with Packer.nvim:

-- 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>')
vim.keymap.set('n', 'gh', ':EasyCompleteHover<CR>')
vim.keymap.set('n', 'gb', ':BackToOriginalBuffer<CR>')

-- 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>
noremap gh :EasyCompleteHover<CR>
noremap gb :BackToOriginalBuffer<CR>

" 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.

Full configuration example.

Lua style setup with require("easycomplete").setup():

-- lua style setup
-- `tabnine_enable = 0` alias `vim.g.easycomplete_tabnine_enable = 0`
require("easycomplete").setup({
    pum_noselect = 0,
    tabnine_enable = 0,
    nerd_font = 1,
    enable = 1,
    winborder = 1,
    ghost_text = 1,
    menu_abbr = 0,
    pum_format = {"abbr", "kind", "menu"}
  })

Useage

  • Tab/S-Tab: select next/previous matched items.
  • Ctrl-]: definition jumping
  • Ctrl-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'))

Commands

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_nerd_font 0 Using nerdfont for lsp icons
g:easycomplete_menu_skin {} Menu skin.
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_tabnine_enable 1 Enable Tabnine
g:easycomplete_directory_enable 1 Directory 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_ghost_text 1 Ghost text
g:easycomplete_pum_maxheight 20 Pum window max height
g:easycomplete_pum_format ["abbr", "kind", "menu"] Pmenu format
g:easycomplete_menu_abbr 1 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_pum_noselect &cot =~ "noselect" Autoselect first matched item or not. Same as set &completeopt+=noselect

Typing :h easycomplete for help.

Language Support

There are tow ways to install lsp server.

  1. vim/nvim: Via command:InstallLspServer.
  2. 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
directory directory 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

More info about supported language:

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"}
    }
}

Snippet Support

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.

AI Coding Inline Suggestion

In addition to AI completion with pum, there are more inline AI coding completion tools.

1)Tabnine inline suggestion

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.

Copilot.nvim plugin is a better choice. Vim-easycomplete is working well with copilot.nvim.

3) Aone Copilot

If you are an Alibaba engineer, then aone copilot is the best choice. You can find configuration guideline based on copilot.nvim on ATA.


Beautify completion menu

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 default
  • EasyNormal: 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

截屏2023-12-30 20 25 06

Add custom completion plugin

add custom completion plugin

License

MIT