summaryrefslogtreecommitdiff
path: root/lua/plugins/lspconfig.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/plugins/lspconfig.lua')
-rw-r--r--lua/plugins/lspconfig.lua84
1 files changed, 75 insertions, 9 deletions
diff --git a/lua/plugins/lspconfig.lua b/lua/plugins/lspconfig.lua
index ca3a791..1657cec 100644
--- a/lua/plugins/lspconfig.lua
+++ b/lua/plugins/lspconfig.lua
@@ -1,16 +1,82 @@
+local servers = {
+ -- clangd = {},
+ -- gopls = {},
+ -- pyright = {},
+ -- rust_analyzer = {},
+ -- tsserver = {},
+
+ lua_ls = {
+ Lua = {
+ workspace = { checkThirdParty = false },
+ telemetry = { enable = false },
+ },
+ },
+}
+
return {
'neovim/nvim-lspconfig',
dependencies = {
- {
- 'williamboman/mason.nvim',
- opts = {
- ensure_installed = {
- "gopls",
- },
- },
- },
+ 'hrsh7th/cmp-nvim-lsp',
+ -- Required for the keybinds
+ 'nvim-telescope/telescope.nvim',
+ { 'williamboman/mason.nvim', config = true },
'williamboman/mason-lspconfig.nvim',
{ 'j-hui/fidget.nvim', opts = {} },
- 'folke/neodev.nvim',
+ { 'folke/neodev.nvim', opts = {} },
},
+ config = function()
+ -- 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 lspconfig = require('lspconfig')
+ local mason_lspconfig = require('mason-lspconfig')
+ mason_lspconfig.ensure_installed = vim.tbl_keys(servers)
+
+ local on_attach = function(_, bufnr)
+ local nmap = function(keys, func, desc)
+ if desc then
+ desc = 'LSP: ' .. desc
+ end
+ vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc })
+ end
+
+ nmap('<leader>rn', vim.lsp.buf.rename, '[R]e[n]ame')
+ nmap('<leader>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('<leader>D', vim.lsp.buf.type_definition, 'Type [D]efinition')
+ nmap('<leader>ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols')
+ nmap('<leader>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('<C-k>', vim.lsp.buf.signature_help, 'Signature Documentation')
+
+ -- Lesser used LSP functionality
+ nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration')
+ nmap('<leader>wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder')
+ nmap('<leader>wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder')
+ nmap('<leader>wl', function()
+ print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
+ end, '[W]orkspace [L]ist Folders')
+
+ -- Create a command `:Format` local to the LSP buffer
+ vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_)
+ vim.lsp.buf.format()
+ end, { desc = 'Format current buffer with LSP' })
+ end
+
+ mason_lspconfig.setup_handlers {
+ function(server_name)
+ lspconfig[server_name].setup {
+ capabilities = capabilities,
+ on_attach = on_attach,
+ settings = servers[server_name],
+ }
+ end,
+ }
+ end,
}