Skip to content
vic

magnars/multiple-cursors.el

Multiple cursors for emacs.

magnars/multiple-cursors.el.json
{
"createdAt": "2012-01-24T08:45:50Z",
"defaultBranch": "master",
"description": "Multiple cursors for emacs.",
"fullName": "magnars/multiple-cursors.el",
"homepage": "",
"language": "Emacs Lisp",
"name": "multiple-cursors.el",
"pushedAt": "2025-10-06T20:38:27Z",
"stargazersCount": 2406,
"topics": [],
"updatedAt": "2025-11-25T12:11:40Z",
"url": "https://github.com/magnars/multiple-cursors.el"
}

Build Status MELPA MELPA Stable NonGNU ELPA

Multiple cursors for Emacs. This is some pretty crazy functionality, so yes, there are kinks. Don’t be afraid though, I’ve been using it since 2011 with great success and much merriment.

I use this package every day, and have been doing so for years. It just works. At least, it works for all my use cases. And if it breaks somehow, I fix it.

However, it has become painfully clear to me that I don’t have time to fix problems I don’t have. It’s been years since I could keep pace with the issues and pull requests. Whenever I try, I keep getting feedback that my fix isn’t good enough by some standard I don’t particularly care about.

So, I have closed the issue tracker and the pull requests. I hope you can happily use this package, just like I do. If it doesn’t work for you, then I’m sorry. Thankfully Emacs is infinitely malleable, you can probably fix it yourself.

TLDR: I am still maintaining this package, but I am no longer crowdsourcing a list of issues.

I highly recommend installing multiple-cursors through package.el.

It’s available on MELPA, MELPA Stable and NonGNU ELPA (enabled by default from Emacs 28 onwards):

M-x package-install multiple-cursors

The package depends on the cl-lib package, so if you do not use package.el or have a recent Emacs, you would need to install that too: see GNU ELPA.

Start out with:

(require 'multiple-cursors)

Then you have to set up your keybindings - multiple-cursors doesn’t presume to know how you’d like them laid out. Here are some examples:

When you have an active region that spans multiple lines, the following will add a cursor to each line:

(global-set-key (kbd "C-S-c C-S-c") 'mc/edit-lines)

When you want to add multiple cursors not based on continuous lines, but based on keywords in the buffer, use:

(global-set-key (kbd "C->") 'mc/mark-next-like-this)
(global-set-key (kbd "C-<") 'mc/mark-previous-like-this)
(global-set-key (kbd "C-c C-<") 'mc/mark-all-like-this)

First mark the word, then add more cursors.

To get out of multiple-cursors-mode, press <return> or C-g. The latter will first disable multiple regions before disabling multiple cursors. If you want to insert a newline in multiple-cursors-mode, use C-j.

You can watch an intro to multiple-cursors at Emacs Rocks.

CommandDescription
mc/mark-next-like-thisAdds a cursor and region at the next part of the buffer forwards that matches the current region.
mc/mark-next-like-this-wordAdds a cursor and region at the next part of the buffer forwards that matches the current region, if no region is selected it selects the word at the point.
mc/mark-next-like-this-symbolAdds a cursor and region at the next part of the buffer forwards that matches the current region, if no region is selected it selects the symbol at the point.
mc/mark-next-word-like-thisLike mc/mark-next-like-this but only for whole words.
mc/mark-next-symbol-like-thisLike mc/mark-next-like-this but only for whole symbols.
mc/mark-previous-like-thisAdds a cursor and region at the next part of the buffer backwards that matches the current region.
mc/mark-previous-like-this-wordAdds a cursor and region at the next part of the buffer backwards that matches the current region, if no region is selected it selects the word at the point.
mc/mark-previous-like-this-symbolAdds a cursor and region at the next part of the buffer backwards that matches the current region, if no region is selected it selects the symbol at the point.
mc/mark-previous-word-like-thisLike mc/mark-previous-like-this but only for whole words.
mc/mark-previous-symbol-like-thisLike mc/mark-previous-like-this but only for whole symbols.
mc/mark-more-like-this-extendedUse arrow keys to quickly mark/skip next/previous occurrences.
mc/add-cursor-on-clickBind to a mouse event to add cursors by clicking. See tips-section.
mc/mark-popSet a cursor at the current point and move to the next (different) position on the mark stack. This allows for fine grained control over the placement of cursors.
CommandDescription
mc/unmark-next-like-thisRemove the cursor furthest down in the buffer.
mc/unmark-previous-like-thisRemove the cursor furthest up in the buffer.
mc/skip-to-next-like-thisRemove the cursor furthest down, marking the next occurrence down.
mc/skip-to-previous-like-thisRemove the cursor furthest up, marking the next occurrence up.
CommandDescription
mc/edit-linesAdds one cursor to each line in the current region.
mc/edit-beginnings-of-linesAdds a cursor at the start of each line in the current region.
mc/edit-ends-of-linesAdds a cursor at the end of each line in the current region.
mc/mark-all-like-thisMarks all parts of the buffer that matches the current region.
mc/mark-all-words-like-thisLike mc/mark-all-like-this but only for whole words.
mc/mark-all-symbols-like-thisLike mc/mark-all-like-this but only for whole symbols.
mc/mark-all-in-regionPrompts for a string to match in the region, adding cursors to all of them.
mc/mark-all-like-this-in-defunMarks all parts of the current defun that matches the current region.
mc/mark-all-words-like-this-in-defunLike mc/mark-all-like-this-in-defun but only for whole words.
mc/mark-all-symbols-like-this-in-defunLike mc/mark-all-like-this-in-defun but only for whole symbols.
mc/mark-all-dwimTries to be smart about marking everything you want. Can be pressed multiple times.
CommandDescription
set-rectangular-region-anchorThink of this one as set-mark except you’re marking a rectangular region.
mc/mark-sgml-tag-pairMark the current opening and closing tag.
mc/insert-numbersInsert increasing numbers for each cursor, top to bottom.
mc/insert-lettersInsert increasing letters for each cursor, top to bottom.
mc/sort-regionsSort the marked regions alphabetically.
mc/reverse-regionsReverse the order of the marked regions.
mc/vertical-alignAligns all cursors vertically with a given CHARACTER to the one with the highest column number (the rightest). (Might not behave as intended if more than one cursors are on the same line.)
mc/vertical-align-with-spaceAligns all cursors with whitespace like mc/vertical-align does.
  • To get out of multiple-cursors-mode, press <return> or C-g. The latter will first disable multiple regions before disabling multiple cursors. If you want to insert a newline in multiple-cursors-mode, use C-j.

  • (define-key mc/keymap (kbd "<return>") nil) will make <return> insert a newline; multiple-cursors-mode can still be disabled with C-g.

  • Sometimes you end up with cursors outside of your view. You can scroll the screen to center on each cursor with C-v and M-v or you can press C-' to hide all lines without a cursor, press C-' again to unhide.

  • Try pressing mc/mark-next-like-this with no region selected. It will just add a cursor on the next line.

  • Try pressing mc/mark-next-like-this-word or mc/mark-next-like-this-symbol with no region selected. It will mark the word or symbol and add a cursor at the next occurrence

  • Try pressing mc/mark-all-like-this-dwim on a tagname in html-mode.

  • Notice that the number of cursors active can be seen in the modeline.

  • If you get out of multiple-cursors-mode and yank - it will yank only from the kill-ring of main cursor. To yank from the kill-rings of every cursor use yank-rectangle, normally found at C-x r y.

  • You can use mc/reverse-regions with nothing selected and just one cursor. It will then flip the sexp at point and the one below it.

  • When you use mc/edit-lines, you can give it a positive or negative prefix to change how it behaves on too short lines.

  • If you would like to keep the global bindings clean, and get custom keybindings when the region is active, you can try region-bindings-mode.

  • There is a special hook that is run when the mode is diabled (which is equivalent to the number of cursors going back to 1): multiple-cursors-mode-disabled-hook

BTW, I highly recommend adding mc/mark-next-like-this to a key binding that’s right next to the key for er/expand-region.

To override a mouse event, you will likely have to also unbind the down-mouse part of the event. Like this:

(global-unset-key (kbd "M-<down-mouse-1>"))
(global-set-key (kbd "M-<mouse-1>") 'mc/add-cursor-on-click)

Or you can do like me and find an unused, but less convenient, binding:

(global-set-key (kbd "C-S-<mouse-1>") 'mc/add-cursor-on-click)

Multiple-cursors uses two lists of commands to know what to do: the run-once list and the run-for-all list. It comes with a set of defaults, but it would be beyond silly to try and include all the known Emacs commands.

So that’s why multiple-cursors occasionally asks what to do about a command. It will then remember your choice by saving it in ~/.emacs.d/.mc-lists.el. You can change the location with:

(setq mc/list-file "/my/preferred/file")

NB! Make sure to do so before requiring multiple-cursors.

It is possible to set multiple-cursors to “run-for-all” for every command except for those that are listed in mc/cmds-to-run-once. To enable this set mc/always-run-for-all to non-nil. Add commands to be run once to mc/cmds-to-run-once in “.mc-lists.el”.

  • isearch-forward and isearch-backward aren’t supported with multiple cursors. If you want this functionality, you can use phi-search.
  • All key bindings that refer to lambdas are always run for all cursors. If you need to limit it, you will have to give it a name.
  • Redo might screw with your cursors. Undo works very well.

Yes, please do. There’s a suite of tests, so remember to add tests for your specific feature, or I might break it later.

You’ll find the repo at:

https://github.com/magnars/multiple-cursors.el

To fetch the test dependencies, install cask if you haven’t already, then:

$ cd /path/to/multiple-cursors
$ cask

Run the tests with:

$ ./run-tests.sh
  • Takafumi Arakaki has contributed several small improvements
  • Marco Baringer contributed looping to mc/cycle and adding cursors without region for mark-more.
  • Ivan Andrus added showing number of cursors in mode-line, and different options for how to handle short lines in mc/edit-lines.
  • Fuco added the first version of mc/mark-all-like-this-dwim
  • Zach Kost-Smith added mc/mark-pop
  • Maciej Katafiasz added mc/mark-all-dwim
  • Aleksey Fedotov added mc-hide-unmatched-lines-mode
  • Jules Tamagnan added mc/mark-next-like-this-word and mc/mark-next-like-this-symbol
  • Ingo Lohmar extended mc/add-cursor-on-click to toggle cursors.
  • Andrea Orru added mc/mark-previous-like-this-word/-symbol

Thanks!

Copyright (C) 2012-2016 Magnar Sveen

Author: Magnar Sveen magnars@gmail.com Keywords: editing cursors

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.