From b87090c9527d4190ce1dc391f4cee983263f4853 Mon Sep 17 00:00:00 2001 From: David Luevano Alvarado Date: Fri, 23 Feb 2024 01:16:07 -0600 Subject: refactor: lspconfig/mason and add null-ls, add c and python support --- lua/plugins/lspconfig.lua | 193 ++++++++++++++++++++++++++-------------------- 1 file changed, 108 insertions(+), 85 deletions(-) (limited to 'lua/plugins/lspconfig.lua') diff --git a/lua/plugins/lspconfig.lua b/lua/plugins/lspconfig.lua index 27ad7b7..3390b51 100644 --- a/lua/plugins/lspconfig.lua +++ b/lua/plugins/lspconfig.lua @@ -1,4 +1,5 @@ local servers = { + clangd = {}, gopls = { -- just the key for the gopls config gopls = { -- settings parameter in lspconfig.setup requires a this table with another "gopls" name completeUnimported = true, @@ -15,7 +16,6 @@ local servers = { allFeatures = true, }, }, - -- jedi_language_server = {}, pyright = {}, lua_ls = { Lua = { @@ -29,104 +29,127 @@ local servers = { } }, }, - } + }, + gdscript = {}, } return { - 'neovim/nvim-lspconfig', - dependencies = { - 'hrsh7th/cmp-nvim-lsp', - -- Required for the keybinds - 'nvim-telescope/telescope.nvim', + { 'williamboman/mason.nvim', - 'williamboman/mason-lspconfig.nvim', - { 'j-hui/fidget.nvim', tag = 'legacy', opts = {} }, - { 'folke/neodev.nvim', opts = {} }, + opts = { + ensure_installed = { + 'clangd', + 'clang-format', + 'gopls', + 'rust-analyzer', + 'mypy', + 'ruff', + 'autopep8', + 'pyright', + 'lua-language-server', + }, + }, + config = function(_, opts) + local mason = require("mason") + mason.setup(opts) + + -- taken from the nvchad + vim.api.nvim_create_user_command("MasonInstallAll", function() + if opts.ensure_installed and #opts.ensure_installed > 0 then + vim.cmd("MasonInstall " .. table.concat(opts.ensure_installed, " ")) + end + end, {}) + + vim.g.mason_binaries_list = opts.ensure_installed + end, }, - config = function() - local lspconfig = require('lspconfig') - local mason = require('mason') - local mason_lspconfig = require('mason-lspconfig') + { + 'neovim/nvim-lspconfig', + dependencies = { + 'hrsh7th/cmp-nvim-lsp', + -- Required for the keybinds + 'nvim-telescope/telescope.nvim', + { 'j-hui/fidget.nvim', tag = 'legacy', opts = {} }, + { 'folke/neodev.nvim', opts = {} }, + }, + config = function() + local lspconfig = require('lspconfig') - -- nvim-cmp supports additional completion capabilities, so broadcast that to servers - local capabilities = vim.lsp.protocol.make_client_capabilities() - capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities) + -- nvim-cmp supports additional completion capabilities, so broadcast that to servers + local capabilities = vim.lsp.protocol.make_client_capabilities() + capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities) - local on_attach = function(_, bufnr) -- _ is client - -- Create a command `:Format` local to the LSP buffer - vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_) - -- on 0.8, you should use vim.lsp.buf.format({ bufnr = bufnr }) instead - -- on later neovim version, you should use vim.lsp.buf.format({ async = false }) instead - vim.lsp.buf.format() - end, { desc = 'Format current buffer with LSP' }) + -- TODO: change keybinds to the autocmd suggested by the lspconfig github + local on_attach = function(_, bufnr) -- _ is client + -- Create a command `:Format` local to the LSP buffer + vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_) + vim.lsp.buf.format({ async = false }) + end, { desc = 'Format current buffer with LSP' }) - -- autoformatting on save from: https://github.com/jose-elias-alvarez/null-ls.nvim/wiki/Formatting-on-save - -- pretty sure this will autoformat any code - -- temporarily disabled as using the keymap is better so far, else a lot of unnecessary changes will be made to random files (such as thesenvim configs) - -- local augroup = vim.api.nvim_create_augroup('LspFormatting', {}) - -- if client.supports_method('textDocument/formatting') then - -- vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr }) - -- vim.api.nvim_create_autocmd('BufWritePre', { - -- group = augroup, - -- buffer = bufnr, - -- callback = function() - -- vim.cmd('Format') - -- end, - -- }) - -- end + -- autoformatting on save from: https://github.com/jose-elias-alvarez/null-ls.nvim/wiki/Formatting-on-save + -- pretty sure this will autoformat any code + -- temporarily disabled as using the keymap is better so far, else a lot of unnecessary changes will be made to random files (such as thesenvim configs) + -- local augroup = vim.api.nvim_create_augroup('LspFormatting', {}) + -- if client.supports_method('textDocument/formatting') then + -- vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr }) + -- vim.api.nvim_create_autocmd('BufWritePre', { + -- group = augroup, + -- buffer = bufnr, + -- callback = function() + -- vim.cmd('Format') + -- end, + -- }) + -- end - local nmap = function(keys, func, desc) - if desc then - desc = 'LSP: ' .. desc + local nmap = function(keys, func, desc) + if desc then + desc = 'LSP: ' .. desc + end + vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc }) end - vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc }) - end - nmap('f', 'Format', '[F]ormat') - nmap('R', 'LspRestart', '[R]estart (lsp)') - nmap('rn', vim.lsp.buf.rename, '[R]e[n]ame') - nmap('ca', vim.lsp.buf.code_action, '[C]ode [A]ction') + nmap('f', 'Format', '[F]ormat') + nmap('R', 'LspRestart', '[R]estart (lsp)') + nmap('rn', vim.lsp.buf.rename, '[R]e[n]ame') + nmap('ca', vim.lsp.buf.code_action, '[C]ode [A]ction') - nmap('gd', vim.lsp.buf.definition, '[G]oto [D]efinition') - nmap('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences') - nmap('gI', vim.lsp.buf.implementation, '[G]oto [I]mplementation') - nmap('D', vim.lsp.buf.type_definition, 'Type [D]efinition') - nmap('ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols') - nmap('ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols') + nmap('gd', vim.lsp.buf.definition, '[G]oto [D]efinition') + nmap('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences') + nmap('gI', vim.lsp.buf.implementation, '[G]oto [I]mplementation') + nmap('D', vim.lsp.buf.type_definition, 'Type [D]efinition') + nmap('ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols') + nmap('ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols') - -- See `:help K` for why this keymap - nmap('k', vim.lsp.buf.hover, 'Hover Documentation') - nmap('K', vim.lsp.buf.signature_help, 'Signature Documentation') + -- See `:help K` for why this keymap + nmap('k', vim.lsp.buf.hover, 'Hover Documentation') + nmap('K', vim.lsp.buf.signature_help, 'Signature Documentation') - -- Lesser used LSP functionality - nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration') - nmap('wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder') - nmap('wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder') - nmap('wl', function() - print(vim.inspect(vim.lsp.buf.list_workspace_folders())) - end, '[W]orkspace [L]ist Folders') - end + -- Lesser used LSP functionality + nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration') + nmap('wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder') + nmap('wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder') + nmap('wl', function() + print(vim.inspect(vim.lsp.buf.list_workspace_folders())) + end, '[W]orkspace [L]ist Folders') + end - mason.setup({}) - mason_lspconfig.setup({ - ensure_installed = vim.tbl_keys(servers), - handlers = { - function(server_name) - lspconfig[server_name].setup({ - capabilities = capabilities, - on_attach = on_attach, - settings = servers[server_name], - }) - end, - } - }) + -- generic server setup + local function setup_server(server_name) + lspconfig[server_name].setup({ + capabilities = capabilities, + on_attach = on_attach, + settings = servers[server_name], + }) + end - -- At the end, add GDscript support, which is only supported by lspconfig itself - lspconfig.gdscript.setup({ - capabilities = capabilities, - on_attach = on_attach, - -- Need a better setup, this is for wsl -> win setup, but the ip will change dynamically - -- cmd = { 'nc', '172.30.112.1', '6005' }, - }) - end, + setup_server('clangd') + setup_server('gopls') + setup_server('rust_analyzer') + setup_server('pyright') + setup_server('lua_ls') + -- change the gdscript cmd for wsl -> win support, need to set: + -- cmd = { 'nc', '172.30.112.1', '6005' }, but the ip changes dynamically + setup_server('gdscript') + end, + }, } -- cgit v1.2.3-54-g00ecf