From bf4ca036acd7e027724de3f70b6d1f0ae7e1ba50 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 7 Aug 2022 22:59:34 -0400 Subject: [PATCH] neovim: Configure LSP for Rust --- nvim/.config/nvim/init.vim | 1 + nvim/.config/nvim/lua/mylsp.lua | 81 +++++++++++++++++++++++++++++++ nvim/.config/nvim/lua/plugins.lua | 10 +++- 3 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 nvim/.config/nvim/lua/mylsp.lua diff --git a/nvim/.config/nvim/init.vim b/nvim/.config/nvim/init.vim index b062cd5..91aef1d 100644 --- a/nvim/.config/nvim/init.vim +++ b/nvim/.config/nvim/init.vim @@ -1,5 +1,6 @@ " Packer plugins lua require('plugins') +lua require('mylsp') " Gruvbox Theme (colorscheme applied from plugins.lua) if has('termguicolors') diff --git a/nvim/.config/nvim/lua/mylsp.lua b/nvim/.config/nvim/lua/mylsp.lua new file mode 100644 index 0000000..d60bef6 --- /dev/null +++ b/nvim/.config/nvim/lua/mylsp.lua @@ -0,0 +1,81 @@ +-- Custom LSP configuration +-- This cannot be done in the config function from Packer +-- because it somehow does not work well with make_client_capabilities() +require("mason-lspconfig").setup({ + ensure_installed = { "rust_analyzer" } +}) + +local opts = { noremap=true, silent=true } +vim.keymap.set('n', 'e', vim.diagnostic.open_float, opts) +vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts) +vim.keymap.set('n', ']d', vim.diagnostic.goto_next, opts) +vim.keymap.set('n', 'q', vim.diagnostic.setloclist, opts) + +local cmp = require 'cmp' +cmp.setup({ + mapping = { + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.scroll_docs(4), + [''] = cmp.mapping.complete(), + [''] = cmp.mapping.confirm { + behavior = cmp.ConfirmBehavior.Replace, + select = true, + }, + [''] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_next_item() + else + fallback() + end + end, { 'i', 's' }), + [''] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_prev_item() + else + fallback() + end + end, { 'i', 's' }), + }, + sources = { + { name = 'nvim_lsp' }, + }, +}) + +-- Rewrite LSP capabilities (to enable completion) +local capabilities = require('cmp_nvim_lsp').update_capabilities(vim.lsp.protocol.make_client_capabilities()) + +-- Use an on_attach function to only map the following keys +-- after the language server attaches to the current buffer +local on_attach = function(client, bufnr) + -- Mappings. + -- See `:help vim.lsp.*` for documentation on any of the below functions + local bufopts = { noremap=true, silent=true, buffer=bufnr } + vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, bufopts) + vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts) + vim.keymap.set('n', 'K', vim.lsp.buf.hover, bufopts) + vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, bufopts) + vim.keymap.set('n', '', vim.lsp.buf.signature_help, bufopts) + vim.keymap.set('n', 'wa', vim.lsp.buf.add_workspace_folder, bufopts) + vim.keymap.set('n', 'wr', vim.lsp.buf.remove_workspace_folder, bufopts) + vim.keymap.set('n', 'wl', function() + print(vim.inspect(vim.lsp.buf.list_workspace_folders())) + end, bufopts) + vim.keymap.set('n', 'D', vim.lsp.buf.type_definition, bufopts) + vim.keymap.set('n', 'rn', vim.lsp.buf.rename, bufopts) + vim.keymap.set('n', 'ca', vim.lsp.buf.code_action, bufopts) + vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts) + vim.keymap.set('n', 'f', vim.lsp.buf.formatting, bufopts) +end + +require('lspconfig')['rust_analyzer'].setup({ + on_attach = on_attach, + settings = { + ['rust_analyzer'] = { + cargo = { + autoreload = true, + buildScripts = { enable = true }, + }, + }, + }, + capabilities = capabilities, +}) diff --git a/nvim/.config/nvim/lua/plugins.lua b/nvim/.config/nvim/lua/plugins.lua index 9ec87a5..4d0ec50 100644 --- a/nvim/.config/nvim/lua/plugins.lua +++ b/nvim/.config/nvim/lua/plugins.lua @@ -4,8 +4,14 @@ return require('packer').startup(function(use) -- Packer can manage itself use 'wbthomason/packer.nvim' - -- External dependencies management - use "williamboman/mason.nvim" + -- LSP stuff + use { + "williamboman/mason.nvim", + "williamboman/mason-lspconfig.nvim", + "neovim/nvim-lspconfig", + "hrsh7th/nvim-cmp", + "hrsh7th/cmp-nvim-lsp", + } -- Gruvbox theme use {