From e86d81eb32cf98cd01c942fc3f6dcef9755ccf8d Mon Sep 17 00:00:00 2001 From: Marko Korhonen Date: Fri, 26 Nov 2021 18:19:36 +0200 Subject: [PATCH] Neovim: switch from lspinstall to nvim-lsp-installer, coq_nvim to nvim-cmp --- home/.config/nvim/init.lua | 1 + home/.config/nvim/lua/autocmd.lua | 3 - .../nvim/lua/pluginconf/completion.lua | 53 +++++++ home/.config/nvim/lua/pluginconf/lsp.lua | 147 ++++-------------- home/.config/nvim/lua/pluginmanager.lua | 13 +- 5 files changed, 94 insertions(+), 123 deletions(-) create mode 100644 home/.config/nvim/lua/pluginconf/completion.lua diff --git a/home/.config/nvim/init.lua b/home/.config/nvim/init.lua index 37c7a23..c88614c 100644 --- a/home/.config/nvim/init.lua +++ b/home/.config/nvim/init.lua @@ -7,6 +7,7 @@ require 'settings' require 'pluginconf.lualine' require 'pluginconf.bufferline' require 'pluginconf.lsp' +require 'pluginconf.completion' require 'pluginconf.treesitter' require 'pluginconf.telescope' -- require 'pluginconf.indent-blankline' diff --git a/home/.config/nvim/lua/autocmd.lua b/home/.config/nvim/lua/autocmd.lua index 8182a21..00a0940 100644 --- a/home/.config/nvim/lua/autocmd.lua +++ b/home/.config/nvim/lua/autocmd.lua @@ -5,6 +5,3 @@ cmd('au TermOpen * tnoremap ') -- Fix YAML indentation cmd('au FileType yaml setlocal ts=2 sts=2 sw=2 expandtab') - --- Run coq.nvim on startup -cmd('au VimEnter * COQnow --shut-up') diff --git a/home/.config/nvim/lua/pluginconf/completion.lua b/home/.config/nvim/lua/pluginconf/completion.lua new file mode 100644 index 0000000..4885deb --- /dev/null +++ b/home/.config/nvim/lua/pluginconf/completion.lua @@ -0,0 +1,53 @@ +-- Add additional capabilities supported by nvim-cmp +local capabilities = vim.lsp.protocol.make_client_capabilities() +capabilities = require('cmp_nvim_lsp').update_capabilities(capabilities) +-- +-- Set completeopt to have a better completion experience +vim.o.completeopt = 'menuone,noselect' + +-- luasnip setup +local luasnip = require 'luasnip' + +-- nvim-cmp setup +local cmp = require 'cmp' +cmp.setup { + snippet = { + expand = function(args) + require('luasnip').lsp_expand(args.body) + end, + }, + mapping = { + [''] = cmp.mapping.select_prev_item(), + [''] = cmp.mapping.select_next_item(), + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.scroll_docs(4), + [''] = cmp.mapping.complete(), + [''] = cmp.mapping.close(), + [''] = cmp.mapping.confirm { + behavior = cmp.ConfirmBehavior.Replace, + select = true, + }, + [''] = function(fallback) + if cmp.visible() then + cmp.select_next_item() + elseif luasnip.expand_or_jumpable() then + luasnip.expand_or_jump() + else + fallback() + end + end, + [''] = function(fallback) + if cmp.visible() then + cmp.select_prev_item() + elseif luasnip.jumpable(-1) then + luasnip.jump(-1) + else + fallback() + end + end, + }, + sources = { + { name = 'nvim_lsp' }, + { name = 'luasnip' }, + }, +} diff --git a/home/.config/nvim/lua/pluginconf/lsp.lua b/home/.config/nvim/lua/pluginconf/lsp.lua index 1f654b9..cbd3948 100644 --- a/home/.config/nvim/lua/pluginconf/lsp.lua +++ b/home/.config/nvim/lua/pluginconf/lsp.lua @@ -1,120 +1,39 @@ --- keymaps -local on_attach = function(client, bufnr) - local function buf_set_keymap(...) - vim.api.nvim_buf_set_keymap(bufnr, ...) - end - local function buf_set_option(...) - vim.api.nvim_buf_set_option(bufnr, ...) - end +local lsp_installer = require("nvim-lsp-installer") - buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc') +-- Register a handler that will be called for all installed servers. +-- Alternatively, you may also register handlers on specific server instances instead (see example below). +lsp_installer.on_server_ready(function(server) + local opts = {} + print(server.name) - -- Mappings. - local opts = {noremap = true, silent = true} - buf_set_keymap('n', 'gD', 'lua vim.lsp.buf.declaration()', opts) - buf_set_keymap('n', 'gd', 'lua vim.lsp.buf.definition()', opts) - buf_set_keymap('n', 'K', 'lua vim.lsp.buf.hover()', opts) - buf_set_keymap('n', 'gi', 'lua vim.lsp.buf.implementation()', opts) - buf_set_keymap('n', '', 'lua vim.lsp.buf.signature_help()', - opts) - buf_set_keymap('n', 'wa', - 'lua vim.lsp.buf.add_workspace_folder()', opts) - buf_set_keymap('n', 'wr', - 'lua vim.lsp.buf.remove_workspace_folder()', opts) - buf_set_keymap('n', 'wl', - 'lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))', - opts) - buf_set_keymap('n', 'D', - 'lua vim.lsp.buf.type_definition()', opts) - buf_set_keymap('n', 'rn', 'lua vim.lsp.buf.rename()', opts) - buf_set_keymap('n', 'gr', 'lua vim.lsp.buf.references()', opts) - buf_set_keymap('n', 'e', - 'lua vim.lsp.diagnostic.show_line_diagnostics()', - opts) - buf_set_keymap('n', '[d', 'lua vim.lsp.diagnostic.goto_prev()', - opts) - buf_set_keymap('n', ']d', 'lua vim.lsp.diagnostic.goto_next()', - opts) - buf_set_keymap('n', 'q', - 'lua vim.lsp.diagnostic.set_loclist()', opts) - - -- Set some keybinds conditional on server capabilities - if client.resolved_capabilities.document_formatting then - buf_set_keymap("n", "f", "lua vim.lsp.buf.formatting()", - opts) - elseif client.resolved_capabilities.document_range_formatting then - buf_set_keymap("n", "f", - "lua vim.lsp.buf.range_formatting()", opts) - end - - -- Set autocommands conditional on server_capabilities - if client.resolved_capabilities.document_highlight then - vim.api.nvim_exec([[ - augroup lsp_document_highlight - autocmd! * - autocmd CursorHold lua vim.lsp.buf.document_highlight() - autocmd CursorMoved lua vim.lsp.buf.clear_references() - augroup END - ]], false) - end -end - --- Configure lua language server for neovim development -local lua_settings = { - Lua = { - runtime = { - -- LuaJIT in the case of Neovim - version = 'LuaJIT', - path = vim.split(package.path, ';') - }, - diagnostics = { - -- Get the language server to recognize the `vim` global - globals = {'vim'} - }, - workspace = { - -- Make the server aware of Neovim runtime files - library = { - [vim.fn.expand('$VIMRUNTIME/lua')] = true, - [vim.fn.expand('$VIMRUNTIME/lua/vim/lsp')] = true + -- (optional) Customize the options passed to the server + if server.name == "sumneko_lua" then + local runtime_path = vim.split(package.path, ';') + opts = { + settings = { + Lua = { + runtime = { + -- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim) + version = 'LuaJIT', + -- Setup your lua path + path = runtime_path + }, + diagnostics = { + -- Get the language server to recognize the `vim` global + globals = {'vim'} + }, + workspace = { + -- Make the server aware of Neovim runtime files + library = vim.api.nvim_get_runtime_file("", true) + }, + -- Do not send telemetry data containing a randomized but unique identifier + telemetry = {enable = false} + } } } - } -} - --- config that activates keymaps and enables snippet support -local function make_config() - local capabilities = vim.lsp.protocol.make_client_capabilities() - capabilities.textDocument.completion.completionItem.snippetSupport = true - return { - -- enable snippet support - capabilities = capabilities, - -- map buffer local keybindings when the language server attaches - on_attach = on_attach - } -end - --- lsp-install -local function setup_servers() - require'lspinstall'.setup() - - -- get all installed servers - local servers = require'lspinstall'.installed_servers() - - for _, server in pairs(servers) do - local config = make_config() - - -- language specific config - if server == "lua" then config.settings = lua_settings end - - require'lspconfig'[server].setup(config) - end -end -setup_servers() - --- Automatically reload after `:LspInstall ` so we don't have to restart neovim -require'lspinstall'.post_install_hook = function() - setup_servers() -- reload installed servers - vim.cmd("bufdo e") -- this triggers the FileType autocmd that starts the server -end + -- This setup() function is exactly the same as lspconfig's setup function. + -- Refer to https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md + server:setup(opts) +end) diff --git a/home/.config/nvim/lua/pluginmanager.lua b/home/.config/nvim/lua/pluginmanager.lua index 5c072b0..eb9cbdd 100644 --- a/home/.config/nvim/lua/pluginmanager.lua +++ b/home/.config/nvim/lua/pluginmanager.lua @@ -61,14 +61,15 @@ require('packer').startup(function() -- Configs for built-in LSP use 'neovim/nvim-lspconfig' - -- Install LSP executables - use 'kabouzeid/nvim-lspinstall' + -- Install LSP server executables + use 'williamboman/nvim-lsp-installer' -- Completion - use {'ms-jpq/coq_nvim', branch = 'coq'} - - -- Snippets for coq_nvim - use {'ms-jpq/coq.artifacts', branch = 'artifacts'} + use 'hrsh7th/nvim-cmp' -- Autocompletion plugin + use 'hrsh7th/cmp-nvim-lsp' -- LSP source for nvim-cmp + use 'hrsh7th/cmp-path' -- Path source for nvim-cmp + use 'saadparwaiz1/cmp_luasnip' -- Snippets source for nvim-cmp + use 'L3MON4D3/LuaSnip' -- Snippets plugin -- treesitter syntax highlight use {'nvim-treesitter/nvim-treesitter', run = ':TSUpdate'}