From b2a2120e780506e88d73b87af5bb5f46aa68e368 Mon Sep 17 00:00:00 2001 From: Mora Unie Youer Date: Thu, 8 May 2025 12:57:13 +0300 Subject: feat: add `multicursor-nvim` --- flake.lock | 17 ++++++++++++++ flake.nix | 9 ++++++++ lua/config/plugins/extra.lua | 54 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+) diff --git a/flake.lock b/flake.lock index 26fc91d..d83ab51 100644 --- a/flake.lock +++ b/flake.lock @@ -244,6 +244,22 @@ "type": "github" } }, + "plugins-multicursor-nvim": { + "flake": false, + "locked": { + "lastModified": 1746157028, + "narHash": "sha256-ZV4/QolvzaxV0SoPwO3Orf3HCJGD2+J15WKRUe0Hauw=", + "owner": "jake-stewart", + "repo": "multicursor.nvim", + "rev": "0e00ce4c272e3191b5e07cab36bd49aa32fca675", + "type": "github" + }, + "original": { + "owner": "jake-stewart", + "repo": "multicursor.nvim", + "type": "github" + } + }, "plugins-telepath-nvim": { "flake": false, "locked": { @@ -266,6 +282,7 @@ "nixCats": "nixCats", "nixpkgs": "nixpkgs_2", "plugins-leap-spooky-nvim": "plugins-leap-spooky-nvim", + "plugins-multicursor-nvim": "plugins-multicursor-nvim", "plugins-telepath-nvim": "plugins-telepath-nvim" } }, diff --git a/flake.nix b/flake.nix index 525edf1..e54c461 100644 --- a/flake.nix +++ b/flake.nix @@ -47,6 +47,11 @@ url = "github:rasulomaroff/telepath.nvim"; flake = false; }; + + plugins-multicursor-nvim = { + url = "github:jake-stewart/multicursor.nvim"; + flake = false; + }; }; # see :help nixCats.flake.outputs @@ -197,6 +202,10 @@ leap-spooky-nvim telepath-nvim ]; + + extra = [ + multicursor-nvim + ]; }; general = with pkgs.vimPlugins; { diff --git a/lua/config/plugins/extra.lua b/lua/config/plugins/extra.lua index 4bbc381..03748fb 100644 --- a/lua/config/plugins/extra.lua +++ b/lua/config/plugins/extra.lua @@ -1,4 +1,58 @@ return { + { + "multicursor-nvim", + event = "DeferredUIEnter", + after = function(_) + local mc = require("multicursor-nvim") + mc.setup({ + signs = false, + }) + + -- Keybindings would be a lot better as + local map = vim.keymap.set + + -- NOTE: this required for "repeatable" commands + -- I'd like to use `2cn` for example (and that doesn't work out of box) + local map_rep = function(modes, bind, action) + map(modes, bind, function() + for _ = 1, vim.v.count1, 1 do + action() + end + end) + end + + -- stylua: ignore start + map({ "n", "x" }, "", function() mc.clearCursors() end) + map({ "n", "x" }, "R", function() mc.restoreCursors() end) + + map_rep({ "n", "x" }, "j", function() mc.lineAddCursor(1) end) + map_rep({ "n", "x" }, "k", function() mc.lineAddCursor(-1) end) + map_rep({ "n", "x" }, "J", function() mc.lineSkipCursor(1) end) + map_rep({ "n", "x" }, "K", function() mc.lineSkipCursor(-1) end) + + map_rep({ "n", "x" }, "cn", function() mc.matchAddCursor(1) end) + map_rep({ "n", "x" }, "cN", function() mc.matchAddCursor(-1) end) + map_rep({ "n", "x" }, "cs", function() mc.matchSkipCursor(1) end) + map_rep({ "n", "x" }, "cS", function() mc.matchSkipCursor(-1) end) + map({ "n", "x" }, "cM", mc.matchAllAddCursors) + map("x", "m", mc.matchCursors) + map("x", "s", mc.splitCursors) + + -- map("n", "g", mc.addCursorOperator) + map({ "n", "x" }, "g", mc.operator) + -- stylua: ignore end + + -- Customize how cursors look. + local hl = vim.api.nvim_set_hl + hl(0, "MultiCursorCursor", { reverse = true }) + hl(0, "MultiCursorVisual", { link = "Visual" }) + hl(0, "MultiCursorSign", { link = "SignColumn" }) + hl(0, "MultiCursorMatchPreview", { link = "Search" }) + hl(0, "MultiCursorDisabledCursor", { reverse = true }) + hl(0, "MultiCursorDisabledVisual", { link = "Visual" }) + hl(0, "MultiCursorDisabledSign", { link = "SignColumn" }) + end, + }, { "yanky.nvim", event = "DeferredUIEnter", -- cgit v1.2.3-70-g09d2