diff --git a/modules/programs/nvim/plugins/default.nix b/modules/programs/nvim/plugins/default.nix index 68088b8..8fcc9e1 100644 --- a/modules/programs/nvim/plugins/default.nix +++ b/modules/programs/nvim/plugins/default.nix @@ -111,7 +111,7 @@ with builtins; } { plugin = nvim-lspconfig; - event = [ "BufReadPre" "BufNewFile" ]; + event = [ "BufRead" "BufNewFile" ]; conf = readFile ./nvim-lspconfig.lua; dependencies = [ { @@ -126,25 +126,35 @@ with builtins; { plugin = lsp_lines-nvim; } { plugin = nvim-ufo; + conf = readFile ./nvim-ufo.lua; dependencies = [ { plugin = promise-async; } ]; } { plugin = neodev-nvim; + conf = readFile ./neodev-nvim.lua; + } + { + plugin = inc-rename-nvim; conf = /* lua */ '' - require("neodev").setup({ - override = function(root_dir, library) - if root_dir:find("/home/moritz/.dotfiles/", 1, true) == 1 then - library.enabled = true - library.plugins = true - end - end, - }) + require("inc_rename").setup { + input_buffer_type = "dressing", + } ''; + dependencies = [ + { + plugin = dressing-nvim; + } + ]; } ]; } + { + plugin = statuscol-nvim; + event = [ "VeryLazy" ]; + conf = readFile ./statuscol-nvim.lua; + } { plugin = vim-fugitive; event = [ "VeryLazy" ]; @@ -191,8 +201,6 @@ with builtins; { key = "sk"; cmd = "Telescope keymaps"; desc = "Keymaps"; } { key = "ss"; cmd = "Telescope lsp_document_symbols"; desc = "Symbols (Document)"; } { key = "sS"; cmd = "Telescope lsp_workspace_symbols"; desc = "Symbols (Workspace)"; } - { key = "gc"; cmd = "Telescope git_commits"; desc = "Commits"; } - { key = "gs"; cmd = "Telescope git_status"; desc = "Status"; } ]; dependencies = [ { plugin = plenary-nvim; } @@ -274,5 +282,14 @@ with builtins; plugin = hmts-nvim; ft = [ "nix" ]; } + { + plugin = zen-mode-nvim; + keys = [ + { key = "tz"; cmd = "ZenMode"; desc = "Zen mode"; } + ]; + dependencies = [ + { plugin = twilight-nvim; } + ]; + } ]; } diff --git a/modules/programs/nvim/plugins/gitsigns-nvim.lua b/modules/programs/nvim/plugins/gitsigns-nvim.lua index 3cdce95..1a17a9b 100644 --- a/modules/programs/nvim/plugins/gitsigns-nvim.lua +++ b/modules/programs/nvim/plugins/gitsigns-nvim.lua @@ -1,22 +1,15 @@ require("gitsigns").setup() require("which-key").register({ - ["["] = { - h = { "Gitsigns prev_hunk", "Previous hunk" }, - }, - ["]"] = { - h = { "Gitsigns next_hunk", "Next hunk" }, - }, -}) -require("which-key").register({ - h = { - name = "hunk", + ["[h"] = { "Gitsigns prev_hunk", "Previous hunk" }, + ["]h"] = { "Gitsigns next_hunk", "Next hunk" }, + ["g"] = { s = { "Gitsigns stage_hunk", "Stage hunk", mode = { "n", "v" } }, r = { "Gitsigns reset_hunk", "Reset hunk", mode = { "n", "v" } }, S = { "Gitsigns stage_buffer", "Stage buffer" }, R = { "Gitsigns reset_buffer", "Reset buffer" }, u = { "Gitsigns undo_stage_hunk", "Undo stage hunk" }, + p = { "Gitsigns preview_hunk_inline", "Preview hunk (inline)" }, + P = { "Gitsigns preview_hunk", "Preview hunk (float)" }, }, -}, { prefix = "g" }) -require("which-key").register({ - h = { ":Gitsigns select_hunk", "Gitsigns select hunk" }, -}, { prefix = "i", mode = { "o", "x" } }) + ["ih"] = { ":Gitsigns select_hunk", "gitsigns hunk", mode = { "o", "x" } }, +}) diff --git a/modules/programs/nvim/plugins/neodev-nvim.lua b/modules/programs/nvim/plugins/neodev-nvim.lua new file mode 100644 index 0000000..a63e89a --- /dev/null +++ b/modules/programs/nvim/plugins/neodev-nvim.lua @@ -0,0 +1,8 @@ +require("neodev").setup({ + override = function(root_dir, library) + if root_dir:find("/home/moritz/.dotfiles/", 1, true) == 1 then + library.enabled = true + library.plugins = true + end + end, +}) diff --git a/modules/programs/nvim/plugins/nvim-lspconfig.lua b/modules/programs/nvim/plugins/nvim-lspconfig.lua index 7fbc917..0c44ceb 100644 --- a/modules/programs/nvim/plugins/nvim-lspconfig.lua +++ b/modules/programs/nvim/plugins/nvim-lspconfig.lua @@ -5,63 +5,43 @@ vim.diagnostic.config({ virtual_text = false, }) -vim.o.foldcolumn = "1" -- '0' is not bad -vim.o.foldlevel = 99 -- Using ufo provider need a large value, feel free to decrease the value -vim.o.foldlevelstart = 99 -vim.o.foldenable = true -vim.o.fillchars = [[eob: ,fold: ,foldopen:,foldsep: ,foldclose:]] -vim.o.statuscolumn = "%= " - -- FIXME: figure out how to put on the other side without having to do a lot of shifting - .. "%s" -- sign column - .. "%{%" -- evaluate this, and then evaluate what it returns - .. "&number ?" - .. "(v:relnum ?" - -- when showing relative numbers, make sure to pad so things don't shift as you move the cursor - .. 'printf("%"..len(line("$")).."s", v:relnum)' - .. ":" - .. "v:lnum" - .. ")" - .. ":" - .. '""' - .. " " -- space between lines and fold - .. "%}" - .. "%= " - .. "%#FoldColumn#" -- highlight group for fold - .. "%{" -- expression for showing fold expand/colapse - .. "foldlevel(v:lnum) > foldlevel(v:lnum - 1)" -- any folds? - .. "? (foldclosed(v:lnum) == -1" -- currently open? - .. '? ""' -- point down - .. ': ""' -- point to right - .. ")" - .. ': " "' -- blank for no fold, or inside fold - .. "}" - .. "%= " -- spacing between end of column and start of text - --- Using ufo provider need remap `zR` and `zM`. If Neovim is 0.6.1, remap yourself -require("which-key").register({ - z = { - R = { require("ufo").openAllFolds, "Open all folds" }, - M = { require("ufo").closeAllFolds, "Close all folds" }, - }, -}) local capabilities = vim.lsp.protocol.make_client_capabilities() +-- NOTE for nvim-ufo -- Tell the server the capability of foldingRange, -- Neovim hasn't added foldingRange to default capabilities, users must add it manually capabilities.textDocument.foldingRange = { dynamicRegistration = false, lineFoldingOnly = true, } -require("ufo").setup() +-- NOTE https://github.com/neovim/neovim/pull/22405 +capabilities.didChangeWatchedFiles = { + dynamicRegistration = true, +} local lspconfig = require("lspconfig") local on_attach_def = function(client, bufnr) require("which-key").register({ - K = { vim.lsp.buf.hover, "Hover" }, + K = { + function() + local winid = require("ufo").peekFoldedLinesUnderCursor() + if not winid then + vim.lsp.buf.hover() + end + end, + "Hover", + }, [""] = { l = { + name = "lsp", d = { vim.diagnostic.open_float, "Open diagnostic window" }, c = { vim.lsp.buf.code_action, "Code action" }, - r = { vim.lsp.buf.rename, "Rename" }, + r = { + function() + return ":IncRename " .. vim.fn.expand("") + end, + "Rename", + expr = true, + }, f = { function() vim.lsp.buf.format({ async = true }) diff --git a/modules/programs/nvim/plugins/nvim-ufo.lua b/modules/programs/nvim/plugins/nvim-ufo.lua new file mode 100644 index 0000000..2399582 --- /dev/null +++ b/modules/programs/nvim/plugins/nvim-ufo.lua @@ -0,0 +1,74 @@ +vim.o.foldcolumn = "1" -- '0' is not bad +vim.o.foldlevel = 99 -- Using ufo provider need a large value, feel free to decrease the value +vim.o.foldlevelstart = 99 +vim.o.foldenable = true + +local ftMap = { + vim = "indent", + python = { "indent" }, + git = "", +} + +---@param bufnr number +---@return Promise +local function customizeSelector(bufnr) + local function handleFallbackException(err, providerName) + if type(err) == "string" and err:match("UfoFallbackException") then + return require("ufo").getFolds(bufnr, providerName) + else + return require("promise").reject(err) + end + end + + return require("ufo") + .getFolds(bufnr, "lsp") + :catch(function(err) + return handleFallbackException(err, "treesitter") + end) + :catch(function(err) + return handleFallbackException(err, "indent") + end) +end + +local 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 + +require("ufo").setup({ + provider_selector = function(_, filetype, _) + return ftMap[filetype] or customizeSelector + end, + fold_virt_text_handler = handler, +}) + +-- Using ufo provider need remap `zR` and `zM`. If Neovim is 0.6.1, remap yourself +require("which-key").register({ + z = { + R = { require("ufo").openAllFolds, "Open all folds" }, + M = { require("ufo").closeAllFolds, "Close all folds" }, + }, +}) diff --git a/modules/programs/nvim/plugins/oil-nvim.lua b/modules/programs/nvim/plugins/oil-nvim.lua index e2afffb..6c9c81e 100644 --- a/modules/programs/nvim/plugins/oil-nvim.lua +++ b/modules/programs/nvim/plugins/oil-nvim.lua @@ -1,4 +1,4 @@ require("oil").setup() require("which-key").register({ - d = { require("oil").toggle_float, "directory (oil)" }, + d = { require("oil").toggle_float, "Directory (oil)" }, }, { prefix = "t" }) diff --git a/modules/programs/nvim/plugins/statuscol-nvim.lua b/modules/programs/nvim/plugins/statuscol-nvim.lua new file mode 100644 index 0000000..b1e1eb1 --- /dev/null +++ b/modules/programs/nvim/plugins/statuscol-nvim.lua @@ -0,0 +1,22 @@ +vim.o.fillchars = [[eob: ,fold: ,foldopen:,foldsep: ,foldclose:]] +local builtin = require("statuscol.builtin") +require("statuscol").setup({ + segments = { + { + sign = { name = { ".*" }, auto = true }, + click = "v:lua.ScSa", + }, + { + text = { builtin.lnumfunc }, + click = "v:lua.ScLa", + }, + { + sign = { name = { "GitSigns" }, auto = true }, + click = "v:lua.ScSa", + }, + { + text = { builtin.foldfunc, " " }, + click = "v:lua.ScFa", + }, + }, +})