From c058fa22eae9216153ff77787eaeeabae01a01ce Mon Sep 17 00:00:00 2001 From: Thomas Preisner Date: Sun, 16 Oct 2022 22:38:02 +0200 Subject: [PATCH] config: nvim: add LSP support together with mason package manager --- config/nvim/lua/plugins.lua | 37 +++++++++++++++++++++++++++ config/nvim/lua/plugins/lspconfig.lua | 24 +++++++++++++++++ config/nvim/lua/plugins/mason.lua | 9 +++++++ config/nvim/lua/plugins/nvim-cmp.lua | 1 + 4 files changed, 71 insertions(+) create mode 100644 config/nvim/lua/plugins/lspconfig.lua create mode 100644 config/nvim/lua/plugins/mason.lua diff --git a/config/nvim/lua/plugins.lua b/config/nvim/lua/plugins.lua index badad52..451ebe4 100644 --- a/config/nvim/lua/plugins.lua +++ b/config/nvim/lua/plugins.lua @@ -43,6 +43,38 @@ return require('packer').startup({ config = function() require('colorizer').setup() end, } + -------------------- + -- Package Manager + -------------------- + use { -- portable package manager + 'williamboman/mason.nvim', + config = load_config('mason'), + } + use { -- update helper for mason + 'WhoIsSethDaniel/mason-tool-installer.nvim', + after = { 'mason.nvim' }, + config = function() require('mason-tool-installer').setup({}) end, + } + + -------------------- + -- LSP Setup + -------------------- + use { -- compatibility layer between mason and lspconfig + autoinstaller + 'williamboman/mason-lspconfig.nvim', + after = { 'mason.nvim' }, + requires = { + 'neovim/nvim-lspconfig', + }, + } + use { -- configuration layer for neovim LSP client + 'neovim/nvim-lspconfig', + after = { + 'mason-lspconfig.nvim', + 'cmp-nvim-lsp', + }, + config = load_config('lspconfig'), + } + -------------------- -- Snippets -------------------- @@ -62,6 +94,10 @@ return require('packer').startup({ -------------------- -- Completion -------------------- + use { -- nvim-cmp source for nvim-lsp + 'hrsh7th/cmp-nvim-lsp', + requires = { 'hrsh7th/nvim-cmp' }, + } use { -- nvim-cmp source for LuaSnip 'saadparwaiz1/cmp_luasnip', requires = { 'hrsh7th/nvim-cmp' }, @@ -82,6 +118,7 @@ return require('packer').startup({ use { -- completion engine 'hrsh7th/nvim-cmp', after = { + 'cmp-nvim-lsp', 'cmp-buffer', 'cmp-path', 'cmp-cmdline', diff --git a/config/nvim/lua/plugins/lspconfig.lua b/config/nvim/lua/plugins/lspconfig.lua new file mode 100644 index 0000000..e2418e1 --- /dev/null +++ b/config/nvim/lua/plugins/lspconfig.lua @@ -0,0 +1,24 @@ +local map = require('utils').map -- import map + +require('mason-lspconfig').setup() +require('mason-lspconfig').setup_handlers({ + function(server_name) -- default handler + -- prepare nvim-cmp source + local capabilities = require('cmp_nvim_lsp').default_capabilities() + require('lspconfig')[server_name].setup({ + -- announce nvim-cmp-lsp capabilities to each lsp server + capabilities = capabilities + }) + end +}) + +-- lsp keybindings +map('n', 'gd', 'lua vim.lsp.buf.definition()') +map('n', 'gD', 'lua vim.lsp.buf.declaration()') +map('n', 'K', 'lua vim.lsp.buf.hover()') +map('n', 'gi', 'lua vim.lsp.buf.implementation()') +map('n', 'gr', 'lua vim.lsp.buf.references()') +map('n', '', 'lua vim.lsp.buf.signature_help()') +map('n', 'rn', 'lua vim.lsp.buf.rename()') +map('n', 'ca', 'lua vim.lsp.buf.code_action()') +map('n', 'f', 'lua vim.lsp.buf.type_definition({ async = true })') diff --git a/config/nvim/lua/plugins/mason.lua b/config/nvim/lua/plugins/mason.lua new file mode 100644 index 0000000..eba961c --- /dev/null +++ b/config/nvim/lua/plugins/mason.lua @@ -0,0 +1,9 @@ +require('mason').setup({ + ui = { + icons = { + package_installed = '✓', + package_pending = '➜', + package_uninstalled = '✗', + }, + }, +}) diff --git a/config/nvim/lua/plugins/nvim-cmp.lua b/config/nvim/lua/plugins/nvim-cmp.lua index c2ff668..0f3dff8 100644 --- a/config/nvim/lua/plugins/nvim-cmp.lua +++ b/config/nvim/lua/plugins/nvim-cmp.lua @@ -10,6 +10,7 @@ cmp.setup({ formatting = { format = function(entry, vim_item) vim_item.menu = ({ + nvim_lsp = '[LSP]', buffer = '[Buffer]', luasnip = '[Snippet]', })[entry.source.name]