Skip to content
Snippets Groups Projects
lsp.lua 3.81 KiB
Newer Older
codecraft's avatar
codecraft committed
-- LSP settings.
--  This function gets run when an LSP connects to a particular buffer.
local on_attach = function(_, bufnr)
codecraft's avatar
codecraft committed
	-- NOTE: Remember that lua is a real programming language, and as such it is possible
	-- to define small helper and utility functions so you don't have to repeat yourself
	-- many times.
	--
	-- In this case, we create a function that lets us more easily define mappings specific
	-- for LSP related items. It sets the mode, buffer and description for us each time.
	local nmap = function(keys, func, desc)
		if desc then
			desc = "LSP: " .. desc
		end
codecraft's avatar
codecraft committed

codecraft's avatar
codecraft committed
		vim.keymap.set("n", keys, func, { buffer = bufnr, desc = desc })
	end
codecraft's avatar
codecraft committed

codecraft's avatar
codecraft committed
	if _.server_capabilities.documentSymbolProvider then
		require("nvim-navic").attach(_, bufnr)
	end
codecraft's avatar
codecraft committed

codecraft's avatar
codecraft committed
	nmap("<leader>rn", vim.lsp.buf.rename, "[R]e[n]ame")
	nmap("<leader>ca", vim.lsp.buf.code_action, "[C]ode [A]ction")
	nmap("<leader>di", vim.diagnostic.open_float, "[D]iagnostic [I]nfo")
	nmap("<leader>dv", "<cmd>Telescope diagnostics<CR>", "[D]iagnostic [V]iew")
codecraft's avatar
codecraft committed

codecraft's avatar
codecraft committed
	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")
codecraft's avatar
codecraft committed

codecraft's avatar
codecraft committed
	-- See `:help K` for why this keymap
	nmap("<leader>K", vim.lsp.buf.hover, "Hover Documentation")
	nmap("<leader>k", vim.lsp.buf.signature_help, "Signature Documentation")
codecraft's avatar
codecraft committed

codecraft's avatar
codecraft committed
	-- 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")
codecraft's avatar
codecraft committed

codecraft's avatar
codecraft committed
	-- 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" })
codecraft's avatar
codecraft committed
end
-- Enable the following language servers
--  Feel free to add/remove any LSPs that you want here. They will automatically be installed.
--
--  Add any additional override configuration in the following tables. They will be passed to
--  the `settings` field of the server config. You must look up that documentation yourself.
local servers = {
codecraft's avatar
codecraft committed
	clangd = {},
	html = {},
	emmet_ls = {},
	cssls = {},
	tsserver = {},
	pyright = {},
	yamlls = {},
	rust_analyzer = {
		imports = {
			granularity = {
				group = "module",
			},
			prefix = "self",
		},
		cargo = {
			buildScripts = {
				enable = true,
			},
codecraft's avatar
codecraft committed
		},
		procMacro = {
			enable = true,
		},
	},
	marksman = {},
	lua_ls = {
		Lua = {
			workspace = { checkThirdParty = false },
			telemetry = { enable = false },
		},
	},
codecraft's avatar
codecraft committed
}

--
codecraft's avatar
codecraft committed
require("completion")
codecraft's avatar
codecraft committed
-- nvim-cmp supports additional completion capabilities, so broadcast that to servers
local capabilities = vim.lsp.protocol.make_client_capabilities()
codecraft's avatar
codecraft committed
capabilities = require("cmp_nvim_lsp").default_capabilities(capabilities)
codecraft's avatar
codecraft committed
capabilities.textDocument.completion.completionItem.snippetSupport = true
-- Setup mason so it can manage external tooling
codecraft's avatar
codecraft committed
require("mason").setup()
codecraft's avatar
codecraft committed

-- Ensure the servers above are installed
codecraft's avatar
codecraft committed
local mason_lspconfig = require("mason-lspconfig")
mason_lspconfig.setup({
	ensure_installed = vim.tbl_keys(servers),
})
codecraft's avatar
codecraft committed

codecraft's avatar
codecraft committed
mason_lspconfig.setup_handlers({
	function(server_name)
		require("lspconfig")[server_name].setup({
			capabilities = capabilities,
			on_attach = on_attach,
			settings = servers[server_name],
		})
	end,
})
codecraft's avatar
codecraft committed
-- Turn on lsp status information
codecraft's avatar
codecraft committed
require("fidget").setup()