From b2a2120e780506e88d73b87af5bb5f46aa68e368 Mon Sep 17 00:00:00 2001
From: Mora Unie Youer <mora_unie_youer@riseup.net>
Date: Thu, 8 May 2025 12:57:13 +0300
Subject: feat: add `multicursor-nvim`

---
 lua/config/plugins/extra.lua | 54 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)

(limited to 'lua/config/plugins')

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 <localleader>
+			local map = vim.keymap.set
+
+			-- NOTE: this required for "repeatable" commands
+			-- I'd like to use `2<localleader>cn` 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" }, "<localleader><localleader>", function() mc.clearCursors() end)
+      map({ "n", "x" }, "<localleader>R", function() mc.restoreCursors() end)
+
+      map_rep({ "n", "x" }, "<localleader>j", function() mc.lineAddCursor(1) end)
+      map_rep({ "n", "x" }, "<localleader>k", function() mc.lineAddCursor(-1) end)
+      map_rep({ "n", "x" }, "<localleader>J", function() mc.lineSkipCursor(1) end)
+      map_rep({ "n", "x" }, "<localleader>K", function() mc.lineSkipCursor(-1) end)
+
+			map_rep({ "n", "x" }, "<localleader>cn", function() mc.matchAddCursor(1) end)
+			map_rep({ "n", "x" }, "<localleader>cN", function() mc.matchAddCursor(-1) end)
+			map_rep({ "n", "x" }, "<localleader>cs", function() mc.matchSkipCursor(1) end)
+			map_rep({ "n", "x" }, "<localleader>cS", function() mc.matchSkipCursor(-1) end)
+      map({ "n", "x" }, "<localleader>cM", mc.matchAllAddCursors)
+      map("x", "<localleader>m", mc.matchCursors)
+      map("x", "<localleader>s", mc.splitCursors)
+
+      -- map("n", "<localleader>g", mc.addCursorOperator)
+      map({ "n", "x" }, "<localleader>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