Skip to content

mrbeardad/nvim-multi-cursor

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 

Repository files navigation

nvim-multi-cursor

Features

  • Implement by using macro recording
  • Repeat your action at each virtual cursor, support all of your customized keymaps
  • Press q/<Esc> to quit multi-cursor-mode
  • Split pasting, which means every cursor works as if it has independent register for change, delete, yank and paste
  • Work with popup completion
  • Work together with vscode-neovim, use vscode multi cursor for insert mode
  • TODO: currently only support normal and insert mode, the actions in visual mode will be synced to virtual cursor when you return to normal mode.
  • TODO: Undo spliting

Installation

Example of lazy.nvim

  {
    "mrbeardad/nvim-multi-cursor",
    -- stylua: ignore
    keys = {
      { "<C-J>", function() require("nvim-multi-cursor.cursor").toggle_cursor_downward() end, mode = { "n" }, desc = "Add Cursor Downward" },
      { "<C-S-J>", function() require("nvim-multi-cursor.cursor").cursor_down() end, mode = { "n" }, desc = "Move Cursor Down" },
      { "<C-K>", function() require("nvim-multi-cursor.cursor").toggle_cursor_upward() end, mode = { "n" }, desc = "Add Cursor Upward" },
      { "<C-S-K>", function() require("nvim-multi-cursor.cursor").cursor_up() end, mode = { "n" }, desc = "Move Cursor Up" },
      { "<C-N>", function() require("nvim-multi-cursor.cursor").toggle_cursor_next_match() end, mode = { "n", "x" }, desc = "Add Cursor at Next Match" },
      { "<C-S-N>", function() require("nvim-multi-cursor.cursor").cursor_next_match() end, mode = { "n" }, desc = "Move Cursor to Next Match" },
      { "<Leader>mw", function() require("nvim-multi-cursor.cursor").toggle_cursor_by_flash([[\<\w*\>]]) end, mode = { "n" }, desc = "Selection Wrod To Add Cursor" },
      { "<Leader>mm", function() require("nvim-multi-cursor.cursor").toggle_cursor_by_flash() end, mode = { "n" }, desc = "Selection To Add Cursor" },
    },
    opts = {
      start_hook = function()
        -- vim.keymap.set({ "n", "x" }, "p", function()
        --   require("nvim-multi-cursor.utils").on_put_pre()
        --   return "p"
        -- end, { buffer = true, expr = true })
        -- vim.keymap.set({ "n", "x" }, "P", function()
        --   require("nvim-multi-cursor.utils").on_put_pre()
        --   return "P"
        -- end, { buffer = true, expr = true })
        vim.keymap.set("i", "<C-r>", function()
          local ch = vim.fn.getcharstr()
          local reg_pattern = [[^[a-zA-Z0-9"_%#*+\-.:/=]$]]
          if string.match(ch, reg_pattern) then
            require("nvim-multi-cursor.utils").on_put_pre(ch)
          end
          return "<C-r>" .. ch
        end, { expr = true, buffer = true })
      end,
      stop_hook = function()
        -- vim.keymap.del({ "n", "x" }, "p", { buffer = true })
        -- vim.keymap.del({ "n", "x" }, "P", { buffer = true })
        vim.keymap.del("i", "<C-r>", { buffer = true })
      end,
      hl_group = "IncSearch"
    },
    vscode = true,
  },

Works together with yanky

  {
    "gbprod/yanky.nvim",
    opts = {
      ring = {
        permanent_wrapper = function(callback)
          return function(state, do_put)
            require("nvim-multi-cursor.utils").on_put_pre()
            return callback(state, do_put)
          end
        end,
      },
    },
  },

This plugin is part of my nvim config, you can find more detail config there, such as how to works together with blink.cmp and flash.nvim

About

Create multiple cursors, works in both neovim and vscode

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages