From e17851efd3d9fc1117e3910d61372006cc173ab7 Mon Sep 17 00:00:00 2001 From: Ingo Lohmar Date: Wed, 2 Mar 2016 21:25:17 +0100 Subject: [PATCH] Fix click-toggling and make it robust (address all PR #239 comments) - use marker-position for cursor overlay's point - new helper function finds fake cursor with its actual *point* where we want it - this also eliminates any need for additional require statements --- mc-mark-more.el | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/mc-mark-more.el b/mc-mark-more.el index f63887d..02a67f4 100644 --- a/mc-mark-more.el +++ b/mc-mark-more.el @@ -72,6 +72,18 @@ (setq furthest cursor))) furthest)) +(defun mc/fake-cursor-at-point (&optional point) + "Return the fake cursor with its point right at POINT (defaults +to (point)), or nil." + (setq point (or point (point))) + (let ((cursors (mc/all-fake-cursors)) + (c nil)) + (catch 'found + (while (setq c (pop cursors)) + (when (eq (marker-position (overlay-get c 'point)) + point) + (throw 'found c)))))) + (defun mc/region-strings () (let ((strings (list (buffer-substring-no-properties (point) (mark))))) (mc/for-each-fake-cursor @@ -587,14 +599,15 @@ already there." (if (not (windowp (posn-window position))) (error "Position not in text area of window")) (select-window (posn-window position)) - (if (numberp (posn-point position)) - (save-excursion - (goto-char (posn-point position)) - (let ((existing (mc/last-fake-cursor-before (point)))) - (if (and existing - (eq (overlay-get existing 'point) (point))) + (let ((pt (posn-point position))) + (if (numberp pt) + ;; is there a fake cursor with the actual *point* right where we are? + (let ((existing (mc/fake-cursor-at-point pt))) + (if existing (mc/remove-fake-cursor existing) - (mc/create-fake-cursor-at-point))))) + (save-excursion + (goto-char pt) + (mc/create-fake-cursor-at-point)))))) (mc/maybe-multiple-cursors-mode))) ;;;###autoload