From 0e2219539754b5f3fe2f290d4c9ef28c27e67a53 Mon Sep 17 00:00:00 2001 From: Henrik Bakken Date: Mon, 24 Mar 2025 23:55:53 +0100 Subject: [PATCH] nvim manual fold+lsp, drop lsp+ufo --- nvim/ftplugin/git.lua | 1 - nvim/init.lua | 330 +++++++++++++++--------------------------- 2 files changed, 120 insertions(+), 211 deletions(-) delete mode 100644 nvim/ftplugin/git.lua diff --git a/nvim/ftplugin/git.lua b/nvim/ftplugin/git.lua deleted file mode 100644 index 5cf4209..0000000 --- a/nvim/ftplugin/git.lua +++ /dev/null @@ -1 +0,0 @@ -vim.cmd("UfoDetach") diff --git a/nvim/init.lua b/nvim/init.lua index 8b0b3ae..b2cd246 100644 --- a/nvim/init.lua +++ b/nvim/init.lua @@ -1,6 +1,6 @@ vim.opt.termguicolors = true -vim.g.mapleader = " " -vim.g.maplocalleader = " " +vim.g.mapleader = vim.keycode("") +vim.g.maplocalleader = vim.keycode("") -- ---------------------------------------- -- SETTINGS @@ -44,6 +44,12 @@ vim.opt.wildmode = { "full" } -- Command-line completion mode vim.opt.wildignore = vim.opt.wildignore + { "*swp", "*.class", "*.pyc", "*.png", "*.jpg", "*.gif", "*.zip", "*/tmp/*", "*.o", ".obj", "*.so" } +-- folding +vim.o.foldenable = true -- enable fold +vim.o.foldlevel = 99 -- start editing with all folds opened +vim.o.foldmethod = "expr" -- use tree-sitter for folding method +vim.o.foldexpr = "v:lua.vim.treesitter.foldexpr()" + -- cursor vim.o.scrolloff = 5 -- Lines of context vim.o.scrolljump = 1 -- Lines to scroll when cursor leaves screen @@ -128,6 +134,118 @@ vim.api.nvim_create_autocmd("ColorScheme", { end, }) +-- ---------------------------------------- +-- LSP +-- ---------------------------------------- + +-- vim.lsp.set_log_level(1) +vim.api.nvim_create_autocmd("LspAttach", { + group = vim.api.nvim_create_augroup("UserLspAttach", { clear = true }), + callback = function(ev) + vim.lsp.completion.enable(true, ev.data.client_id, ev.buf) + local bmap = function(mode, keys, func) vim.keymap.set(mode, keys, func, { buffer = ev.buf, noremap = true }) end + local diag = vim.diagnostic + local severity = diag.severity.HINT + -- workspaces + bmap("n", "wa", vim.lsp.buf.add_workspace_folder) + bmap("n", "wr", vim.lsp.buf.remove_workspace_folder) + bmap("n", "wl", function() print(vim.inspect(vim.lsp.buf.list_workspace_folders())) end) + -- jump + bmap("n", "", function() diag.open_float({ source = true }) end) + bmap("n", "", function() diag.jump({ severity = { min = severity }, float = true, count = 1 }) end) + bmap("n", "", function() diag.jump({ severity = { min = severity }, float = true, count = -1 }) end) + bmap("n", "gd", vim.lsp.buf.definition) + bmap("n", "gD", vim.lsp.buf.type_definition) + bmap("n", "gi", vim.lsp.buf.declaration) + bmap("n", "gI", vim.lsp.buf.implementation) + -- quickfix + bmap("n", "gl", diag.setloclist) + bmap("n", "gr", vim.lsp.buf.references) + -- popups + bmap({ "n", "i" }, "", vim.lsp.buf.signature_help) + -- other + bmap("n", "K", vim.lsp.buf.hover) + bmap("n", "", vim.lsp.buf.rename) + bmap("n", "ca", vim.lsp.buf.code_action) + + -- NOTE: Using `assert` bypasses needing to do a nil check before accessing a member that could be nil + local client = assert(vim.lsp.get_client_by_id(ev.data.client_id)) + end, +}) + +vim.lsp.config("*", { root_markers = { ".git" } }) +vim.lsp.config["lua_ls"] = { + cmd = { "lua-language-server" }, + filetypes = { "lua" }, + root_markers = { + ".luarc.json", + ".luarc.jsonc", + ".stylua.toml", + "stylua.toml", + ".git", + }, + settings = { + Lua = { + workspace = { + checkThirdParty = false, + library = { vim.env.VIMRUNTIME }, + }, + telemetry = { enable = false }, + diagnostics = { globals = { "vim" } }, + format = { enable = false }, + runtime = { version = "LuaJIT" }, + }, + }, +} +vim.lsp.enable("lua_ls") +vim.lsp.config["pyright"] = { + cmd = { "pyright-langserver", "--stdio" }, + filetypes = { "python" }, + root_markers = { + "pyproject.toml", + "setup.py", + "setup.cfg", + "requirements.txt", + "pyrightconfig.json", + ".git", + }, + settings = { + python = { + analysis = { autoImportCompletions = false, diagnosticMode = "workspace", useLibraryCodeForTypes = false }, + }, + }, +} +vim.lsp.enable("pyright") +vim.lsp.config["html"] = { + cmd = { "vscode-html-language-server", "--stdio" }, + filetypes = { "html" }, + settings = { + html = { + format = { + templating = true, + wrapLineLength = 120, + wrapAttributes = "auto", + }, + hover = { + documentation = true, + references = true, + }, + }, + }, +} +vim.lsp.enable("html") +vim.lsp.config["yaml"] = { + cmd = { "yaml-language-server", "--stdio" }, + filetypes = { "yaml" }, + settings = { + yaml = { + schemas = { kubernetes = "/home/hjalmarlucius/src/hjarl/system/manifests/*.yaml" }, + -- schemaStore = { enable = false, url = "" }, + }, + }, +} +vim.lsp.enable("yaml") + -- ---------------------------------------- -- PLUGINS -- ---------------------------------------- @@ -774,76 +892,6 @@ require("lazy").setup({ require("telescope").load_extension("undo") end, }, - { - "kevinhwang91/nvim-ufo", - dependencies = { "kevinhwang91/promise-async" }, - opts = { - preview = { - mappings = { - scrollU = "", - scrollD = "", - jumpTop = "[", - jumpBot = "]", - }, - }, - fold_virt_text_handler = function(virtText, lnum, endLnum, width, truncate) - local newVirtText = {} - local suffix = (" 󰁂 %d "):format(endLnum - lnum) - local sufWidth = vim.fn.strdisplaywidth(suffix) - local targetWidth = width - sufWidth - local curWidth = 0 - for _, chunk in ipairs(virtText) do - local chunkText = chunk[1] - local chunkWidth = vim.fn.strdisplaywidth(chunkText) - if targetWidth > curWidth + chunkWidth then - table.insert(newVirtText, chunk) - else - chunkText = truncate(chunkText, targetWidth - curWidth) - local hlGroup = chunk[2] - table.insert(newVirtText, { chunkText, hlGroup }) - chunkWidth = vim.fn.strdisplaywidth(chunkText) - -- str width returned from truncate() may less than 2nd argument, need padding - if curWidth + chunkWidth < targetWidth then - suffix = suffix .. (" "):rep(targetWidth - curWidth - chunkWidth) - end - break - end - curWidth = curWidth + chunkWidth - end - table.insert(newVirtText, { suffix, "MoreMsg" }) - return newVirtText - end, - }, - keys = { - -- zm/M zr/R increase/increase foldlevel (max) - -- zo/O zc/C open / close fold (max) - -- za zA switch fold (small/full) - -- zi toggle folds - -- zi zj move to next / prev fold - { - "zR", - function() require("ufo").openAllFolds() end, - }, - { - "zM", - function() require("ufo").closeAllFolds() end, - }, - { - "zm", - function() require("ufo").closeFoldsWith() end, - }, - { - "zr", - function() require("ufo").openFoldsExceptKinds() end, - }, - }, - init = function() - vim.o.foldcolumn = "0" - vim.o.foldlevel = 99 - vim.o.foldlevelstart = 99 - vim.o.foldenable = true - end, - }, { -- Highlight, edit, and navigate code "nvim-treesitter/nvim-treesitter", @@ -1000,144 +1048,6 @@ require("lazy").setup({ }) end, }, - { - "neovim/nvim-lspconfig", - lazy = false, - dependencies = { - "williamboman/mason.nvim", - "williamboman/mason-lspconfig.nvim", - "kevinhwang91/nvim-ufo", - { "j-hui/fidget.nvim", opts = {} }, - }, - event = { "BufReadPost", "BufNewFile" }, - cmd = { "LspInfo", "LspInstall", "LspUninstall" }, - keys = { { "", "LspInfo", noremap = true } }, - config = function() - local on_attach = function(client, bufnr) - local bmap = function(mode, keys, func) - vim.keymap.set(mode, keys, func, { buffer = bufnr, noremap = true }) - end - -- workspaces - bmap("n", "wa", vim.lsp.buf.add_workspace_folder) - bmap("n", "wr", vim.lsp.buf.remove_workspace_folder) - bmap("n", "wl", function() print(vim.inspect(vim.lsp.buf.list_workspace_folders())) end) - -- jump - bmap("n", "", function() vim.diagnostic.open_float({ source = true }) end) - bmap( - "n", - "", - function() - vim.diagnostic.jump({ - severity = { min = vim.diagnostic.severity.HINT }, - float = true, - count = 1, - }) - end - ) - bmap( - "n", - "", - function() - vim.diagnostic.jump({ - severity = { min = vim.diagnostic.severity.HINT }, - float = true, - count = -1, - }) - end - ) - bmap("n", "gd", vim.lsp.buf.definition) - bmap("n", "gD", vim.lsp.buf.type_definition) - bmap("n", "gi", vim.lsp.buf.declaration) - bmap("n", "gI", vim.lsp.buf.implementation) - -- quickfix - bmap("n", "gl", vim.diagnostic.setloclist) - bmap("n", "gr", vim.lsp.buf.references) - -- popups - bmap({ "n", "i" }, "", vim.lsp.buf.signature_help) - -- other - bmap("n", "K", function() - local winid = require("ufo").peekFoldedLinesUnderCursor() - if not winid then vim.lsp.buf.hover() end - end) - bmap("n", "", vim.lsp.buf.rename) - bmap("n", "ca", vim.lsp.buf.code_action) - end - - local server_configs = { - pyright = { - python = { - analysis = { autoImportCompletions = false, diagnosticMode = "openFilesOnly" }, - }, - }, - lua_ls = { - Lua = { - workspace = { - checkThirdParty = false, - -- Make the server aware of Neovim runtime files - library = vim.api.nvim_get_runtime_file("", true), - }, - telemetry = { enable = false }, - diagnostics = { - -- Get the language server to recognize the `vim` global in init.lua - globals = { "vim", "core" }, - }, - format = { enable = false }, - }, - }, - html = { - html = { - format = { - templating = true, - wrapLineLength = 120, - wrapAttributes = "auto", - }, - hover = { - documentation = true, - references = true, - }, - }, - }, - yamlls = { - yaml = { - schemas = { kubernetes = "/home/hjalmarlucius/src/hjarl/system/manifests/*.yaml" }, - -- schemaStore = { enable = false, url = "" }, - }, - }, - } - - local capabilities = vim.lsp.protocol.make_client_capabilities() - - local ufo = require("ufo") - if ufo then - capabilities.textDocument.foldingRange = { - dynamicRegistration = false, - lineFoldingOnly = true, - } - end - - local mason_lspconfig = require("mason-lspconfig") - mason_lspconfig.setup({ - ensure_installed = { - "cssls", - "html", - "jsonls", - "yamlls", - "bashls", - "pyright", - "lua_ls", - }, - }) - mason_lspconfig.setup_handlers({ - function(server_name) - require("lspconfig")[server_name].setup({ - capabilities = capabilities, - on_attach = on_attach, - settings = server_configs[server_name], - }) - end, - }) - end, - }, { "folke/noice.nvim", event = "VeryLazy",