From 08dd334ac5e64707f86931fc7d8b21464c312ac8 Mon Sep 17 00:00:00 2001 From: ShatteredMINT Date: Mon, 30 Sep 2024 05:35:11 +0200 Subject: [PATCH] set up lsp --- .gitignore | 1 + lua/config/init.lua | 2 ++ lua/config/lazy.lua | 5 ++++ lua/config/lsp.lua | 69 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+) create mode 100644 .gitignore create mode 100644 lua/config/lsp.lua diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e033bc6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +lazy-lock.json diff --git a/lua/config/init.lua b/lua/config/init.lua index 55b8979..c7db2fa 100644 --- a/lua/config/init.lua +++ b/lua/config/init.lua @@ -1 +1,3 @@ require("config.lazy") +require("config.lsp") +require("config.theme") diff --git a/lua/config/lazy.lua b/lua/config/lazy.lua index 940433b..2b17254 100644 --- a/lua/config/lazy.lua +++ b/lua/config/lazy.lua @@ -19,4 +19,9 @@ require("lazy").setup({ "L3MON4D3/LuaSnip", version = "v2.*", }, + + -- LSP manager + "williamboman/mason.nvim", + "williamboman/mason-lspconfig.nvim", + "neovim/nvim-lspconfig", }) diff --git a/lua/config/lsp.lua b/lua/config/lsp.lua new file mode 100644 index 0000000..ed2a43c --- /dev/null +++ b/lua/config/lsp.lua @@ -0,0 +1,69 @@ +require('mason').setup({ + ui = { + icons = { + package_installed = "✓", + package_pending = "➜", + package_uninstalled = "✗" + } + } +}) + +local servers = { 'pylsp', 'lua_ls', 'rust_analyzer' } + +require('mason-lspconfig').setup({ + -- A list of servers to automatically install if they're not already installed + ensure_installed = servers, +}) + +-- Set different settings for different languages' LSP +-- LSP list: https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md +-- How to use setup({}): https://github.com/neovim/nvim-lspconfig/wiki/Understanding-setup-%7B%7D +-- - the settings table is sent to the LSP +-- - on_attach: a lua callback function to run after LSP attaches to a given buffer +local lspconfig = require('lspconfig') + +-- Customized on_attach function +-- See `:help vim.diagnostic.*` for documentation on any of the below functions +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) + +-- 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) + -- Enable completion triggered by + vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc') + + -- 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", function() + vim.lsp.buf.format({ async = true }) + end, bufopts) +end + +-- Configure each language +-- How to add LSP for a specific language? +-- 1. use `:Mason` to install corresponding LSP +-- 2. add configuration below + +for _, lsp in ipairs(servers) do + lspconfig[lsp].setup { + on_attach = on_attach, + } +end