Gered
bd7eb9be0f
i don't like having a large part of the mason config stuffed away in the lsp plugin config file as lsp isn't the only thing that mason helps with. however it is a bit icky to organize, as mason config does need to be spread out in different places to integrate with the different components like lsp, dap, formatting, etc.
162 lines
7.4 KiB
Lua
162 lines
7.4 KiB
Lua
return {
|
|
-- LSP Plugins
|
|
{
|
|
-- `lazydev` configures Lua LSP for your Neovim config, runtime and plugins
|
|
-- used for completion, annotations and signatures of Neovim apis
|
|
'folke/lazydev.nvim',
|
|
ft = 'lua',
|
|
opts = {
|
|
library = {
|
|
-- Load luvit types when the `vim.uv` word is found
|
|
{ path = 'luvit-meta/library', words = { 'vim%.uv' } },
|
|
},
|
|
},
|
|
},
|
|
{ 'Bilal2453/luvit-meta', lazy = true },
|
|
{
|
|
-- Main LSP Configuration
|
|
'neovim/nvim-lspconfig',
|
|
dependencies = {
|
|
'williamboman/mason.nvim',
|
|
'williamboman/mason-lspconfig.nvim',
|
|
'WhoIsSethDaniel/mason-tool-installer.nvim',
|
|
|
|
-- Useful status updates for LSP.
|
|
-- NOTE: `opts = {}` is the same as calling `require('fidget').setup({})`
|
|
{ 'j-hui/fidget.nvim', opts = {} },
|
|
|
|
-- Allows extra capabilities provided by nvim-cmp
|
|
'hrsh7th/cmp-nvim-lsp',
|
|
},
|
|
config = function()
|
|
-- This function gets run when an LSP attaches to a particular buffer.
|
|
-- That is to say, every time a new file is opened that is associated with
|
|
-- an lsp (for example, opening `main.rs` is associated with `rust_analyzer`) this
|
|
-- function will be executed to configure the current buffer
|
|
vim.api.nvim_create_autocmd('LspAttach', {
|
|
group = vim.api.nvim_create_augroup('kickstart-lsp-attach', { clear = true }),
|
|
callback = function(event)
|
|
local map = function(keys, func, desc, mode)
|
|
mode = mode or 'n'
|
|
vim.keymap.set(mode, keys, func, { buffer = event.buf, desc = 'LSP: ' .. desc })
|
|
end
|
|
|
|
-- Jump to the definition of the word under your cursor.
|
|
-- This is where a variable was first declared, or where a function is defined, etc.
|
|
-- To jump back, press <C-t>.
|
|
map('gd', require('telescope.builtin').lsp_definitions, '[G]oto [D]efinition')
|
|
|
|
-- WARN: This is not Goto Definition, this is Goto Declaration.
|
|
-- For example, in C this would take you to the header.
|
|
map('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration')
|
|
|
|
-- Find references for the word under your cursor.
|
|
map('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences')
|
|
|
|
-- Jump to the implementation of the word under your cursor.
|
|
-- Useful when your language has ways of declaring types without an actual implementation.
|
|
map('gI', require('telescope.builtin').lsp_implementations, '[G]oto [I]mplementation')
|
|
|
|
-- Jump to the type of the word under your cursor.
|
|
-- Useful when you're not sure what type a variable is and you want to see
|
|
-- the definition of its *type*, not where it was *defined*.
|
|
map('<leader>lt', require('telescope.builtin').lsp_type_definitions, '[T]ype Definition')
|
|
|
|
-- Fuzzy find all the symbols in your current document.
|
|
-- Symbols are things like variables, functions, types, etc.
|
|
map('<leader>ld', require('telescope.builtin').lsp_document_symbols, '[D]ocument Symbols')
|
|
|
|
-- Fuzzy find all the symbols in your current workspace.
|
|
-- Similar to document symbols, except searches over your entire project.
|
|
map('<leader>lw', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace Symbols')
|
|
|
|
-- Rename the variable under your cursor.
|
|
-- Most Language Servers support renaming across files, etc.
|
|
map('<leader>lr', vim.lsp.buf.rename, '[R]ename')
|
|
|
|
-- Execute a code action, usually your cursor needs to be on top of an error
|
|
-- or a suggestion from your LSP for this to activate.
|
|
map('<leader>la', vim.lsp.buf.code_action, 'Code [A]ction', { 'n', 'x' })
|
|
|
|
-- The following two autocommands are used to highlight references of the
|
|
-- word under your cursor when your cursor rests there for a little while.
|
|
-- See `:help CursorHold` for information about when this is executed
|
|
--
|
|
-- When you move your cursor, the highlights will be cleared (the second autocommand).
|
|
local client = vim.lsp.get_client_by_id(event.data.client_id)
|
|
if client and client.supports_method(vim.lsp.protocol.Methods.textDocument_documentHighlight) then
|
|
local highlight_augroup = vim.api.nvim_create_augroup('kickstart-lsp-highlight', { clear = false })
|
|
vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, {
|
|
buffer = event.buf,
|
|
group = highlight_augroup,
|
|
callback = vim.lsp.buf.document_highlight,
|
|
})
|
|
|
|
vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, {
|
|
buffer = event.buf,
|
|
group = highlight_augroup,
|
|
callback = vim.lsp.buf.clear_references,
|
|
})
|
|
|
|
vim.api.nvim_create_autocmd('LspDetach', {
|
|
group = vim.api.nvim_create_augroup('kickstart-lsp-detach', { clear = true }),
|
|
callback = function(event2)
|
|
vim.lsp.buf.clear_references()
|
|
vim.api.nvim_clear_autocmds { group = 'kickstart-lsp-highlight', buffer = event2.buf }
|
|
end,
|
|
})
|
|
end
|
|
|
|
if client and client.supports_method(vim.lsp.protocol.Methods.textDocument_inlayHint) then
|
|
map('<leader>th', function()
|
|
vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled { bufnr = event.buf })
|
|
end, '[T]oggle Inlay [H]ints')
|
|
end
|
|
end,
|
|
})
|
|
|
|
local capabilities = vim.lsp.protocol.make_client_capabilities()
|
|
capabilities = vim.tbl_deep_extend('force', capabilities, require('cmp_nvim_lsp').default_capabilities())
|
|
|
|
-- Enable the following language servers
|
|
-- Add any additional override configuration in the following tables. Available keys are:
|
|
-- - cmd (table): Override the default command used to start the server
|
|
-- - filetypes (table): Override the default list of associated filetypes for the server
|
|
-- - capabilities (table): Override fields in capabilities. Can be used to disable certain LSP features.
|
|
-- - settings (table): Override the default settings passed when initializing the server.
|
|
-- For example, to see the options for `lua_ls`, you could go to: https://luals.github.io/wiki/settings/
|
|
local servers = {
|
|
lua_ls = {
|
|
-- cmd = {...},
|
|
-- filetypes = { ...},
|
|
-- capabilities = {},
|
|
settings = {
|
|
Lua = {
|
|
completion = {
|
|
callSnippet = 'Replace',
|
|
},
|
|
-- You can toggle below to ignore Lua_LS's noisy `missing-fields` warnings
|
|
-- diagnostics = { disable = { 'missing-fields' } },
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
require('mason-lspconfig').setup {
|
|
handlers = {
|
|
function(server_name)
|
|
local server = servers[server_name] or {}
|
|
-- This handles overriding only values explicitly passed
|
|
-- by the server configuration above. Useful when disabling
|
|
-- certain features of an LSP (for example, turning off formatting for tsserver)
|
|
server.capabilities = vim.tbl_deep_extend('force', {}, capabilities, server.capabilities or {})
|
|
require('lspconfig')[server_name].setup(server)
|
|
end,
|
|
},
|
|
}
|
|
end,
|
|
},
|
|
}
|
|
|
|
-- vim: ts=2 sts=2 sw=2 et
|