From dc22766af5f18961e34559719fe2d3ef1082e6e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mon=20ou=C3=AFe?= Date: Mon, 27 Aug 2012 13:17:14 +0200 Subject: [PATCH] Macros must be defined before they are used to be expanded properly --- multiple-cursors-core.el | 75 ++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/multiple-cursors-core.el b/multiple-cursors-core.el index 4d8d652..fbf7c24 100644 --- a/multiple-cursors-core.el +++ b/multiple-cursors-core.el @@ -37,6 +37,43 @@ "The face used for fake regions" :group 'multiple-cursors) +(defmacro mc/add-fake-cursor-to-undo-list (&rest forms) + "Make sure point is in the right place when undoing" + `(let ((undo-cleaner (cons 'apply (cons 'deactivate-cursor-after-undo (list id))))) + (setq buffer-undo-list (cons undo-cleaner buffer-undo-list)) + ,@forms + (if (eq undo-cleaner (car buffer-undo-list)) ;; if nothing has been added to the undo-list + (setq buffer-undo-list (cdr buffer-undo-list)) ;; then pop the cleaner right off again + (setq buffer-undo-list ;; otherwise add a function to activate this cursor + (cons (cons 'apply (cons 'activate-cursor-for-undo (list id))) buffer-undo-list))))) + +(defmacro mc/for-each-fake-cursor (&rest forms) + "Runs the body for each fake cursor, bound to the name cursor" + `(mapc #'(lambda (cursor) + (when (mc/fake-cursor-p cursor) + ,@forms)) + (overlays-in (point-min) (point-max)))) + +(defmacro mc/save-excursion (&rest forms) + "Saves and restores all the state that multiple-cursors cares about." + `(let ((current-state (mc/store-current-state-in-overlay + (make-overlay (point) (point) nil nil t)))) + (overlay-put current-state 'type 'original-cursor) + (save-excursion ,@forms) + (mc/pop-state-from-overlay current-state))) + +(defmacro mc/save-window-scroll (&rest forms) + "Saves and restores the window scroll position" + `(let ((p (set-marker (make-marker) (point))) + (start (set-marker (make-marker) (window-start))) + (hscroll (window-hscroll))) + ,@forms + (goto-char p) + (set-window-start nil start) + (set-window-hscroll nil hscroll) + (set-marker p nil) + (set-marker start nil))) + (defun mc/make-cursor-overlay-at-eol (pos) "Create overlay to look like cursor at end of line." (let ((overlay (make-overlay pos pos nil nil nil))) @@ -100,7 +137,6 @@ highlights the entire width of the window." "Restore the state stored in given overlay and then remove the overlay." (mc/restore-state-from-overlay o) (mc/remove-fake-cursor o)) - (defun mc/delete-region-overlay (o) "Remove the dependent region overlay for a given cursor overlay." (ignore-errors @@ -151,16 +187,6 @@ cursor with updated info." (mc/execute-command cmd) (mc/create-fake-cursor-at-point id))))))))) -(defmacro mc/add-fake-cursor-to-undo-list (&rest forms) - "Make sure point is in the right place when undoing" - `(let ((undo-cleaner (cons 'apply (cons 'deactivate-cursor-after-undo (list id))))) - (setq buffer-undo-list (cons undo-cleaner buffer-undo-list)) - ,@forms - (if (eq undo-cleaner (car buffer-undo-list)) ;; if nothing has been added to the undo-list - (setq buffer-undo-list (cdr buffer-undo-list)) ;; then pop the cleaner right off again - (setq buffer-undo-list ;; otherwise add a function to activate this cursor - (cons (cons 'apply (cons 'activate-cursor-for-undo (list id))) buffer-undo-list))))) - (defun mc/fake-cursor-p (o) "Predicate to check if an overlay is a fake cursor" (eq (overlay-get o 'type) 'fake-cursor)) @@ -189,33 +215,6 @@ cursor with updated info." (mc/pop-state-from-overlay mc--stored-state-for-undo) (setq mc--stored-state-for-undo nil))) -(defmacro mc/for-each-fake-cursor (&rest forms) - "Runs the body for each fake cursor, bound to the name cursor" - `(mapc #'(lambda (cursor) - (when (mc/fake-cursor-p cursor) - ,@forms)) - (overlays-in (point-min) (point-max)))) - -(defmacro mc/save-excursion (&rest forms) - "Saves and restores all the state that multiple-cursors cares about." - `(let ((current-state (mc/store-current-state-in-overlay - (make-overlay (point) (point) nil nil t)))) - (overlay-put current-state 'type 'original-cursor) - (save-excursion ,@forms) - (mc/pop-state-from-overlay current-state))) - -(defmacro mc/save-window-scroll (&rest forms) - "Saves and restores the window scroll position" - `(let ((p (set-marker (make-marker) (point))) - (start (set-marker (make-marker) (window-start))) - (hscroll (window-hscroll))) - ,@forms - (goto-char p) - (set-window-start nil start) - (set-window-hscroll nil hscroll) - (set-marker p nil) - (set-marker start nil))) - (defun mc/prompt-for-inclusion-in-whitelist (original-command) "Asks the user, then adds the command either to the once-list or the all-list." (let ((all-p (y-or-n-p (format "Do %S for all cursors?" original-command))))