branch: elpa/multiple-cursors
commit 97e5db17c5ba631d3c2af17eac3414872224ca08
Merge: 9b53e89 3f1611c
Author: Magnar Sveen <[email protected]>
Commit: Magnar Sveen <[email protected]>
Merge pull request #207 from vermiculus/master
Add safety ceiling to cursor count at creation
---
multiple-cursors-core.el | 35 +++++++++++++++++++++++++++++++++--
1 file changed, 33 insertions(+), 2 deletions(-)
diff --git a/multiple-cursors-core.el b/multiple-cursors-core.el
index 8971a42..6602703 100644
--- a/multiple-cursors-core.el
+++ b/multiple-cursors-core.el
@@ -176,9 +176,37 @@ highlights the entire width of the window."
"Returns a unique cursor id"
(incf mc--current-cursor-id))
+(defvar mc--max-cursors-original nil
+ "This variable maintains the original maximum number of cursors.
+When `mc/create-fake-cursor-at-point' is called and
+`mc/max-cursors' is overridden, this value serves as a backup so
+that `mc/max-cursors' can take on a new value. When
+`mc/remove-fake-cursors' is called, the values are reset.")
+
+(defcustom mc/max-cursors nil
+ "Safety ceiling for the number of active cursors.
+If your emacs slows down or freezes when using too many cursors,
+customize this value appropriately.
+
+Cursors will be added until this value is reached, at which point
+you can either temporarily override the value or abort the
+operation entirely.
+
+If this value is nil, there is no ceiling."
+ :type '(integer)
+ :group 'multiple-cursors)
+
(defun mc/create-fake-cursor-at-point (&optional id)
"Add a fake cursor and possibly a fake active region overlay based on point
and mark.
Saves the current state in the overlay to be restored later."
+ (unless mc--max-cursors-original
+ (setq mc--max-cursors-original mc/max-cursors))
+ (when mc/max-cursors
+ (unless (< (mc/num-cursors) mc/max-cursors)
+ (if (yes-or-no-p (format "%d active cursors. Continue? "
(mc/num-cursors)))
+ (setq mc/max-cursors (read-number "Enter a new, temporary maximum:
"))
+ (mc/remove-fake-cursors)
+ (error "Aborted: too many cursors"))))
(let ((overlay (mc/make-cursor-overlay-at-point)))
(overlay-put overlay 'mc-id (or id (mc/create-cursor-id)))
(overlay-put overlay 'type 'fake-cursor)
@@ -382,7 +410,10 @@ the original cursor, to inform about the lack of support."
Do not use to conclude editing with multiple cursors. For that
you should disable multiple-cursors-mode."
(mc/for-each-fake-cursor
- (mc/remove-fake-cursor cursor)))
+ (mc/remove-fake-cursor cursor))
+ (when mc--max-cursors-original
+ (setq mc/max-cursors mc--max-cursors-original))
+ (setq mc--max-cursors-original nil))
(defun mc/keyboard-quit ()
"Deactivate mark if there are any active, otherwise exit
multiple-cursors-mode."
@@ -424,7 +455,7 @@ The entries are returned in the order they are found in the
buffer."
(defun mc--maybe-set-killed-rectangle ()
"Add the latest kill-ring entry for each cursor to killed-rectangle.
So you can paste it in later with `yank-rectangle'."
- (let ((entries (mc--kill-ring-entries)))
+ (let ((entries (let (mc/max-cursors) (mc--kill-ring-entries))))
(unless (mc--all-equal entries)
(setq killed-rectangle entries))))