From 7876fabd7c5c625194ee723972e63105eca4b505 Mon Sep 17 00:00:00 2001 From: Ibrahim Muftee Date: Thu, 3 Oct 2024 17:54:22 -0500 Subject: feat(nvim): neovim config rewrite --- dot_config/nvim/lua/plugins/lsp.lua | 237 ++++++++++++++++++++++++++++++++++++ 1 file changed, 237 insertions(+) create mode 100644 dot_config/nvim/lua/plugins/lsp.lua (limited to 'dot_config/nvim/lua/plugins/lsp.lua') diff --git a/dot_config/nvim/lua/plugins/lsp.lua b/dot_config/nvim/lua/plugins/lsp.lua new file mode 100644 index 0000000..b944572 --- /dev/null +++ b/dot_config/nvim/lua/plugins/lsp.lua @@ -0,0 +1,237 @@ +return { + { + "VonHeikemen/lsp-zero.nvim", + branch = "v4.x", + lazy = true, + config = false, + }, + + { + "williamboman/mason.nvim", + lazy = false, + config = true, + }, + + -- Autocompletion + { + "hrsh7th/nvim-cmp", + event = { "InsertEnter", "CmdlineEnter" }, + dependencies = { + "L3MON4D3/LuaSnip", -- Snippet engine + "onsails/lspkind.nvim", -- Pretty formatting in the completion menu + + -- Completion sources + "hrsh7th/cmp-nvim-lsp", + "hrsh7th/cmp-nvim-lsp-signature-help", + "hrsh7th/cmp-buffer", + "hrsh7th/cmp-path", + "saadparwaiz1/cmp_luasnip", + }, + config = function() + local cmp = require("cmp") + local luasnip = require("luasnip") + + cmp.setup({ + completion = { + -- See :help completeopt + completeopt = "menu,menuone,noinsert,preview", + }, + snippet = { + expand = function(args) + luasnip.lsp_expand(args.body) + end, + }, + mapping = cmp.mapping.preset.insert({ + [""] = cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Insert }), + [""] = cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Insert }), + [""] = cmp.mapping.scroll_docs(-4), + [""] = cmp.mapping.scroll_docs(4), + + -- Ctrl+Space does not currently work in Neovim core on Windows + -- https://github.com/neovim/neovim/issues/8435 + -- [""] = cmp.mapping.complete(), + [""] = cmp.mapping.complete(), + + [""] = cmp.mapping.abort(), + [""] = cmp.mapping.confirm({ + -- Accept currently selected item + behavior = cmp.ConfirmBehavior.Insert, + select = true, + }), + [""] = cmp.mapping.confirm({ + -- Accept currently selected item, replacing stuff as needed + behavior = cmp.ConfirmBehavior.Replace, + select = true, + }), + [""] = cmp.mapping({ + -- https://github.com/hrsh7th/nvim-cmp/wiki/Example-mappings#safely-select-entries-with-cr + i = function(fallback) + -- In insert mode, only use Enter to complete something if cmp + -- is active and the user has explicitly selected an item + if cmp.visible() and cmp.get_active_entry() then + cmp.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = false }) + else + fallback() + end + end, + s = cmp.mapping.confirm({ select = true }), + c = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = true }), + }), + }), + sorting = { + priority_weight = 2, + comparators = { + cmp.config.compare.exact, + + -- Mostly default sort order from cmp + cmp.config.compare.offset, + -- cmp.config.compare.scopes, --this is commented in nvim-cmp too + cmp.config.compare.score, + cmp.config.compare.recently_used, + cmp.config.compare.locality, + cmp.config.compare.kind, + cmp.config.compare.sort_text, + cmp.config.compare.length, + cmp.config.compare.order, + }, + }, + sources = { + -- LSP results should be first priority + { name = "nvim_lsp", group_index = 1 }, + + { name = "nvim_lsp_signature_help", group_index = 2 }, + { name = "lazydev", group_index = 2 }, + { name = "luasnip", group_index = 2 }, + { name = "path", group_index = 2 }, + { name = "buffer", group_index = 2, keyword_length = 5 }, + }, + ---@diagnostic disable-next-line: missing-fields + formatting = { + format = require("lspkind").cmp_format({ + mode = "symbol_text", + maxwidth = function() + return math.floor(0.45 * vim.o.columns) + end, + ellipsis_char = "...", + show_labelDetails = true, + }), + }, + experimental = { + ghost_text = { + hl_group = "LspCodeLens", + }, + }, + window = { + completion = cmp.config.window.bordered(), + documentation = cmp.config.window.bordered(), + }, + }) + end, + }, + + -- LSP + { + "neovim/nvim-lspconfig", + cmd = { "LspInfo", "LspInstall", "LspStart" }, + event = { "BufReadPre", "BufNewFile" }, + dependencies = { + { "hrsh7th/cmp-nvim-lsp" }, + { "williamboman/mason.nvim" }, + { "williamboman/mason-lspconfig.nvim" }, + }, + config = function() + local lsp_zero = require("lsp-zero") + + lsp_zero.extend_lspconfig({ + sign_text = true, + capabilities = require("cmp_nvim_lsp").default_capabilities(), + }) + + local border = { + { "🭽", "FloatBorder" }, + { "▔", "FloatBorder" }, + { "🭾", "FloatBorder" }, + { "▕", "FloatBorder" }, + { "🭿", "FloatBorder" }, + { "▁", "FloatBorder" }, + { "🭼", "FloatBorder" }, + { "▏", "FloatBorder" }, + } + + local border_handlers = { + ["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, { border = border }), + ["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signature_help, { border = border }), + } + + require("mason-lspconfig").setup({ + ensure_installed = { "basedpyright", "ruff", "lua_ls", "gopls", "rust_analyzer" }, + handlers = { + -- this first function is the "default handler" + -- it applies to every language server without a "custom handler" + function(server_name) + require("lspconfig")[server_name].setup({ handlers = border_handlers }) + end, + + ["basedpyright"] = function() + local lspconfig = require("lspconfig") + lspconfig.basedpyright.setup({ + settings = { + basedpyright = { + typeCheckingMode = "standard", + }, + }, + }) + end, + }, + }) + + vim.lsp.inlay_hint.enable() + end, + }, + + -- Formatting + { + "stevearc/conform.nvim", + config = function() + local conform = require("conform") + local prettier = { "prettierd", "prettier" } + conform.setup({ + formatters_by_ft = { + lua = { "stylua" }, + python = { "ruff", lsp_format = "fallback" }, + go = { "gopls" }, + rust = { "clippy", lsp_format = "fallback" }, + markdown = prettier, + }, + format_after_save = { + async = true, + stop_after_first = true, + lsp_format = "fallback", + }, + }) + end, + }, + + -- Code actions + { + "aznhe21/actions-preview.nvim", + config = function() + vim.keymap.set({ "v", "n" }, "ca", require("actions-preview").code_actions) + end, + }, + + -- Cool neovim dev stuff + { + "folke/lazydev.nvim", + ft = "lua", -- only load on lua files + opts = { + library = { + -- See the configuration section for more details + -- Load luvit types when the `vim.uv` word is found + { path = "luvit-meta/library", words = { "vim%.uv" } }, + }, + }, + }, + + { "Bilal2453/luvit-meta", lazy = true }, -- optional `vim.uv` typings +} -- cgit v1.2.3