nvim: Switch to nvim-cmp

nvim-compe has been deprecated. While we tried to make it a few days
without any completion support, in javascript/typescript could not get
the default omnicompletion to work at all. It is possible that this
could be due to nvim-lsp-ts-utils/null-ls but who is gonna debug.

Also tried MUcomplete but it just would not work. There are open issues
on this. See https://github.com/neovim/neovim/issues/12390 and also
https://github.com/lifepillar/vim-mucomplete/issues/179.

So here we are with nvim-cmp. Some observations in comparison to compe
before. Using buffer completion seems not possible as most of the times
LSP completion items then do not turn up. Do not know if this is server
specific but at least it is the case with Rust. compe seemed better
performance wise especially in tsserver and considering the buffer
problem mentioned above. Also, even with vsnip added as the completion
source can't seem to get any snippet specific completions working.

Could have ditched all completion support if I did not have to use
tsserver but need it for work currently. So we will stick to enabling
this and hopefully it improves in future.

Fuck nodejs, javascript and typescript.

For references see,
https://github.com/kristijanhusak/neovim-config
https://github.com/sQVe/dotfiles/tree/master/config/nvim
This commit is contained in:
Sanchayan Maity 2021-09-25 11:25:22 +05:30
parent b95a14b8d1
commit be02b5ead7
4 changed files with 68 additions and 84 deletions

View file

@ -0,0 +1,54 @@
local cmp = require 'cmp'
local lspkind = require 'lspkind'
cmp.setup {
formatting = {
format = function(entry, vim_item)
vim_item.menu = ({
buffer = '[Buffer]',
nvim_lsp = '[Lsp]',
nvim_lua = '[Lua]',
path = '[Path]',
vsnip = '[Snippet]',
})[entry.source.name]
vim_item.kind = lspkind.presets.default[vim_item.kind]
return vim_item
end,
},
snippet = {
expand = function (args)
vim.fn["vsnip#anonymous"](args.body)
end
},
documentation = {
border = 'rounded'
},
mapping = {
['<CR>'] = cmp.mapping.confirm({
behavior = cmp.ConfirmBehavior.Replace,
select = true
}),
},
sources = {
{
name = 'nvim_lsp',
priority = 100
},
{
name = 'vsnip',
priority = 80
},
{
name = 'nvim_lua',
priority = 50
},
{
name = 'buffer',
priority = 20
},
{
name = 'path',
priority = 5
},
}
}

View file

@ -1,82 +0,0 @@
local remap = vim.api.nvim_set_keymap
require'compe'.setup {
enabled = true;
autocomplete = false;
debug = false;
min_length = 1;
preselect = 'enable';
throttle_time = 80;
source_timeout = 200;
resolve_timeout = 800;
incomplete_delay = 400;
max_abbr_width = 100;
max_kind_width = 100;
max_menu_width = 100;
documentation = {
border = { '', '' ,'', ' ', '', '', '', ' ' },
winhighlight = "NormalFloat:CompeDocumentation,FloatBorder:CompeDocumentationBorder",
max_width = 120,
min_width = 60,
max_height = math.floor(vim.o.lines * 0.3),
min_height = 1,
};
source = {
path = true;
buffer = true;
calc = true;
nvim_lsp = true;
nvim_lua = true;
omni = false;
spell = true;
tags = false;
treesitter = true;
snippets_nvim = false;
vsnip = true;
ultisnips = false;
luasnip = false;
emoji = false;
};
}
local t = function(str)
return vim.api.nvim_replace_termcodes(str, true, true, true)
end
local check_back_space = function()
local col = vim.fn.col('.') - 1
if col == 0 or vim.fn.getline('.'):sub(col, col):match('%s') then
return true
else
return false
end
end
-- Use (S-)tab to:
-- Move to prev/next item in completion menuone
_G.tab_complete = function()
if vim.fn.pumvisible() == 1 then
return t "<C-n>"
elseif vim.fn.call("vsnip#available", {1}) == 1 then
return t "<Plug>(vsnip-expand-or-jump)"
elseif check_back_space() then
return t "<Tab>"
else
return vim.fn['compe#complete']()
end
end
_G.s_tab_complete = function()
if vim.fn.pumvisible() == 1 then
return t "<C-p>"
else
return t "<S-Tab>"
end
end
remap("i", "<Tab>", "v:lua.tab_complete()", {expr = true})
remap("s", "<Tab>", "v:lua.tab_complete()", {expr = true})
remap("i", "<S-Tab>", "v:lua.s_tab_complete()", {expr = true})
remap("s", "<S-Tab>", "v:lua.s_tab_complete()", {expr = true})

View file

@ -168,7 +168,7 @@ function set_snippet_capabilities()
'additionalTextEdits', 'additionalTextEdits',
} }
} }
return capabilities return require('cmp_nvim_lsp').update_capabilities(capabilities)
end end
-- This should be called only once, so cannot be in on_attach as earlier. -- This should be called only once, so cannot be in on_attach as earlier.
@ -188,6 +188,7 @@ end
nvim_lsp.clangd.setup { nvim_lsp.clangd.setup {
on_attach = on_attach, on_attach = on_attach,
capabilities = set_snippet_capabilities(),
default_config = { default_config = {
cmd = { "clangd", "--background-index", "--pch-storage=memory", "--clang-tidy", "--suggest-missing-includes" }, cmd = { "clangd", "--background-index", "--pch-storage=memory", "--clang-tidy", "--suggest-missing-includes" },
filetypes = { 'c', 'cpp' }, filetypes = { 'c', 'cpp' },
@ -283,6 +284,7 @@ table.insert(runtime_path, "lua/?/init.lua")
nvim_lsp.sumneko_lua.setup { nvim_lsp.sumneko_lua.setup {
cmd = { "/usr/bin/lua-language-server" }; cmd = { "/usr/bin/lua-language-server" };
on_attach = on_attach, on_attach = on_attach,
capabilities = set_snippet_capabilities(),
settings = { settings = {
Lua = { Lua = {
runtime = { runtime = {

View file

@ -19,7 +19,17 @@ local init = function ()
-- Manage Project sessions -- Manage Project sessions
use 'thaerkh/vim-workspace' use 'thaerkh/vim-workspace'
-- For autocompletion -- For autocompletion
use 'hrsh7th/nvim-compe' use {
'hrsh7th/nvim-cmp',
requires = {
'hrsh7th/cmp-nvim-lsp',
'hrsh7th/cmp-nvim-lua',
'hrsh7th/cmp-buffer',
'hrsh7th/cmp-vsnip',
'hrsh7th/cmp-path',
'onsails/lspkind-nvim'
}
}
-- Git support -- Git support
use 'lewis6991/gitsigns.nvim' use 'lewis6991/gitsigns.nvim'
use 'tpope/vim-fugitive' use 'tpope/vim-fugitive'