-- return { -- "mason-org/mason-lspconfig.nvim", -- opts = { -- ensure_installed = { "lua_ls", "rust_analyzer", "pyright" }, -- }, -- dependencies = { -- { "mason-org/mason.nvim", opts = {} }, -- "neovim/nvim-lspconfig", -- }, -- } return { "VonHeikemen/lsp-zero.nvim", branch = "v2.x", dependencies = { -- LSP Support { "neovim/nvim-lspconfig" }, -- Required { -- Optional "williamboman/mason.nvim", build = function() pcall(vim.cmd, "MasonUpdate") end, }, { "williamboman/mason-lspconfig.nvim" }, -- Optional -- Autocompletion { "hrsh7th/nvim-cmp" }, -- Required { "hrsh7th/cmp-nvim-lsp" }, -- Required { "L3MON4D3/LuaSnip" }, -- Required { "rafamadriz/friendly-snippets" }, { "hrsh7th/cmp-buffer" }, { "hrsh7th/cmp-path" }, { "hrsh7th/cmp-cmdline" }, { "saadparwaiz1/cmp_luasnip" }, }, config = function() local lsp = require("lsp-zero") lsp.on_attach(function(client, bufnr) local opts = { buffer = bufnr, remap = false } vim.keymap.set("n", "gr", function() vim.lsp.buf.references() end, vim.tbl_deep_extend("force", opts, { desc = "LSP Goto Reference" })) vim.keymap.set("n", "gd", function() vim.lsp.buf.definition() end, vim.tbl_deep_extend("force", opts, { desc = "LSP Goto Definition" })) vim.keymap.set("n", "K", function() vim.lsp.buf.hover() end, vim.tbl_deep_extend("force", opts, { desc = "LSP Hover" })) vim.keymap.set("n", "vws", function() vim.lsp.buf.workspace_symbol() end, vim.tbl_deep_extend("force", opts, { desc = "LSP Workspace Symbol" })) vim.keymap.set("n", "vd", function() vim.diagnostic.setloclist() end, vim.tbl_deep_extend("force", opts, { desc = "LSP Show Diagnostics" })) vim.keymap.set("n", "[d", function() vim.diagnostic.goto_next() end, vim.tbl_deep_extend("force", opts, { desc = "Next Diagnostic" })) vim.keymap.set("n", "]d", function() vim.diagnostic.goto_prev() end, vim.tbl_deep_extend("force", opts, { desc = "Previous Diagnostic" })) vim.keymap.set("n", "vca", function() vim.lsp.buf.code_action() end, vim.tbl_deep_extend("force", opts, { desc = "LSP Code Action" })) vim.keymap.set("n", "vrr", function() vim.lsp.buf.references() end, vim.tbl_deep_extend("force", opts, { desc = "LSP References" })) vim.keymap.set("n", "vrn", function() vim.lsp.buf.rename() end, vim.tbl_deep_extend("force", opts, { desc = "LSP Rename" })) vim.keymap.set("i", "", function() vim.lsp.buf.signature_help() end, vim.tbl_deep_extend("force", opts, { desc = "LSP Signature Help" })) end) require("mason").setup({}) require("mason-lspconfig").setup({ ensure_installed = { "eslint", "lua_ls", "jsonls", "html", "tailwindcss", -- "pylsp", "dockerls", "bashls", "gopls", "pyright", }, handlers = { lsp.default_setup, lua_ls = function() local lua_opts = lsp.nvim_lua_ls() require("lspconfig").lua_ls.setup(lua_opts) end, }, }) local cmp_action = require("lsp-zero").cmp_action() local cmp = require("cmp") local cmp_select = { behavior = cmp.SelectBehavior.Select } require("luasnip.loaders.from_vscode").lazy_load() -- `/` cmdline setup. cmp.setup.cmdline("/", { mapping = cmp.mapping.preset.cmdline(), sources = { { name = "buffer" }, }, }) -- `:` cmdline setup. cmp.setup.cmdline(":", { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ { name = "path" }, }, { { name = "cmdline", option = { ignore_cmds = { "Man", "!" }, }, }, }), }) cmp.setup({ snippet = { expand = function(args) require("luasnip").lsp_expand(args.body) end, }, sources = { { name = "nvim_lsp" }, { name = "luasnip", keyword_length = 2 }, { name = "buffer", keyword_length = 3 }, { name = "path" }, }, mapping = cmp.mapping.preset.insert({ [""] = cmp.mapping.select_prev_item(cmp_select), [""] = cmp.mapping.select_next_item(cmp_select), [""] = cmp.mapping.confirm({ select = true }), [""] = cmp.mapping.complete(), [""] = cmp_action.luasnip_jump_forward(), [""] = cmp_action.luasnip_jump_backward(), [""] = cmp_action.luasnip_supertab(), [""] = cmp_action.luasnip_shift_supertab(), }), }) end, }