From be02b5ead72138ac3a20b01ea54958b457004cfd Mon Sep 17 00:00:00 2001 From: Sanchayan Maity Date: Sat, 25 Sep 2021 11:25:22 +0530 Subject: [PATCH] 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 --- nvim/.config/nvim/after/plugin/cmp.lua | 54 ++++++++++++ nvim/.config/nvim/after/plugin/completion.lua | 82 ------------------- nvim/.config/nvim/lua/lsp.lua | 4 +- nvim/.config/nvim/lua/plugins.lua | 12 ++- 4 files changed, 68 insertions(+), 84 deletions(-) create mode 100644 nvim/.config/nvim/after/plugin/cmp.lua delete mode 100644 nvim/.config/nvim/after/plugin/completion.lua diff --git a/nvim/.config/nvim/after/plugin/cmp.lua b/nvim/.config/nvim/after/plugin/cmp.lua new file mode 100644 index 0000000..b961e79 --- /dev/null +++ b/nvim/.config/nvim/after/plugin/cmp.lua @@ -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 = { + [''] = 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 + }, + } +} diff --git a/nvim/.config/nvim/after/plugin/completion.lua b/nvim/.config/nvim/after/plugin/completion.lua deleted file mode 100644 index f1c23d7..0000000 --- a/nvim/.config/nvim/after/plugin/completion.lua +++ /dev/null @@ -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 "" - elseif vim.fn.call("vsnip#available", {1}) == 1 then - return t "(vsnip-expand-or-jump)" - elseif check_back_space() then - return t "" - else - return vim.fn['compe#complete']() - end -end - -_G.s_tab_complete = function() - if vim.fn.pumvisible() == 1 then - return t "" - else - return t "" - end -end - -remap("i", "", "v:lua.tab_complete()", {expr = true}) -remap("s", "", "v:lua.tab_complete()", {expr = true}) -remap("i", "", "v:lua.s_tab_complete()", {expr = true}) -remap("s", "", "v:lua.s_tab_complete()", {expr = true}) diff --git a/nvim/.config/nvim/lua/lsp.lua b/nvim/.config/nvim/lua/lsp.lua index 630ba41..aa7cb8c 100644 --- a/nvim/.config/nvim/lua/lsp.lua +++ b/nvim/.config/nvim/lua/lsp.lua @@ -168,7 +168,7 @@ function set_snippet_capabilities() 'additionalTextEdits', } } - return capabilities + return require('cmp_nvim_lsp').update_capabilities(capabilities) end -- This should be called only once, so cannot be in on_attach as earlier. @@ -188,6 +188,7 @@ end nvim_lsp.clangd.setup { on_attach = on_attach, + capabilities = set_snippet_capabilities(), default_config = { cmd = { "clangd", "--background-index", "--pch-storage=memory", "--clang-tidy", "--suggest-missing-includes" }, filetypes = { 'c', 'cpp' }, @@ -283,6 +284,7 @@ table.insert(runtime_path, "lua/?/init.lua") nvim_lsp.sumneko_lua.setup { cmd = { "/usr/bin/lua-language-server" }; on_attach = on_attach, + capabilities = set_snippet_capabilities(), settings = { Lua = { runtime = { diff --git a/nvim/.config/nvim/lua/plugins.lua b/nvim/.config/nvim/lua/plugins.lua index 8862d32..19daf78 100644 --- a/nvim/.config/nvim/lua/plugins.lua +++ b/nvim/.config/nvim/lua/plugins.lua @@ -19,7 +19,17 @@ local init = function () -- Manage Project sessions use 'thaerkh/vim-workspace' -- 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 use 'lewis6991/gitsigns.nvim' use 'tpope/vim-fugitive'