]> git.eshelyaron.com Git - emacs.git/commitdiff
Add `save-mark-and-excursion', which has the old `save-excursion' behavior
authorDaniel Colascione <dancol@dancol.org>
Mon, 4 May 2015 18:46:12 +0000 (11:46 -0700)
committerDaniel Colascione <dancol@dancol.org>
Mon, 4 May 2015 18:46:12 +0000 (11:46 -0700)
* doc/lispref/positions.texi (Excursions): Document
`save-mark-and-excursion'.

* lisp/font-lock.el (font-lock-fontify-block): Use
`save-mark-and-excursion' instead of `save-excursion', restoring
Emacs 24 behavior.

* lisp/simple.el (save-mark-and-excursion--save)
(save-mark-and-excursion--restore): New functions.
(save-mark-and-excursion): New user macro.

* src/editfns.c (Fsave_excursion): Mention
`save-mark-and-excursion' in `save-excursion' documentation.

doc/lispref/positions.texi
lisp/font-lock.el
lisp/simple.el
src/editfns.c

index fc47f1c7a78a6f6b87b50be16ede4f9cf1b80632..e7c79d5824185a236bf3896b62b7b6d1b98e9c40 100644 (file)
@@ -888,6 +888,14 @@ type @code{nil}.  @xref{Marker Insertion Types}.  Therefore, when the
 saved point value is restored, it normally comes before the inserted
 text.
 
+@defmac save-mark-and-excursion body@dots{}
+@cindex mark excursion
+@cindex point excursion
+This macro is like @code{save-excursion}, but also saves and restores
+the mark location and @code{mark-active}.  This macro does what
+@code{save-excursion} did before Emacs 25.1.
+@end defmac
+
 @node Narrowing
 @section Narrowing
 @cindex narrowing
index 96b290e34f4a7a8beb5f4d71db68c71798c631e5..b1455131114239cd5b81b0e9c7b33b3eb3e4f9a6 100644 (file)
@@ -1350,7 +1350,7 @@ delimit the region to fontify."
        deactivate-mark)
     ;; Make sure we have the right `font-lock-keywords' etc.
     (if (not font-lock-mode) (font-lock-set-defaults))
-    (save-excursion
+    (save-mark-and-excursion
       (save-match-data
        (condition-case error-data
            (if (or arg (not font-lock-mark-block-function))
index 31efe3896d4d7eb068dbfeeb8c8ea53bbb5f1900..9f42f00b149c8eac0113d2fe3f398c08a2903f91 100644 (file)
@@ -4870,6 +4870,44 @@ store it in a Lisp variable.  Example:
     (setq mark-active nil)
     (set-marker (mark-marker) nil)))
 
+(defun save-mark-and-excursion--save ()
+  (cons
+   (let ((mark (mark-marker)))
+     (and mark (marker-position mark) (copy-marker mark)))
+   mark-active))
+
+(defun save-mark-and-excursion--restore (saved-mark-info)
+  (let ((saved-mark (car saved-mark-info))
+        (omark (marker-position (mark-marker)))
+        (nmark nil)
+        (saved-mark-active (cdr saved-mark-info)))
+    ;; Mark marker
+    (if (null saved-mark)
+        (set-marker (mark-marker nil))
+      (setf nmark (marker-position saved-mark))
+      (set-marker (mark-marker) nmark)
+      (set-marker saved-mark nil))
+    ;; Mark active
+    (let ((cur-mark-active mark-active))
+      (setf mark-active saved-mark-active)
+      ;; If mark is active now, and either was not active or was at a
+      ;; different place, run the activate hook.
+      (if saved-mark-active
+          (unless (eq omark nmark)
+            (run-hooks 'activate-mark-hook))
+        ;; If mark has ceased to be active, run deactivate hook.
+        (when cur-mark-active
+          (run-hooks 'deactivate-mark-hook))))))
+
+(defmacro save-mark-and-excursion (&rest body)
+  "Like `save-excursion', but also save and restore the mark state.
+This macro does what `save-excursion' did before Emacs 25.1."
+  (let ((saved-marker-sym (make-symbol "saved-marker")))
+    `(let ((,saved-marker-sym (save-mark-and-excursion--save)))
+       (unwind-protect
+            (save-excursion ,@body)
+         (save-mark-and-excursion--restore ,saved-marker-sym)))))
+
 (defcustom use-empty-active-region nil
   "Whether \"region-aware\" commands should act on empty regions.
 If nil, region-aware commands treat empty regions as inactive.
index dead48c1a62e3cef01cabd89e7357e34d9b16b40..1686fbf668b9226eb63d3ee60569d4dadfdf24b8 100644 (file)
@@ -908,6 +908,10 @@ even in case of abnormal exit (throw or error).
 If you only want to save the current buffer but not point,
 then just use `save-current-buffer', or even `with-current-buffer'.
 
+Before Emacs 25.1, `save-excursion' used to save the mark state.
+To save the marker state as well as the point and buffer, use
+`save-mark-and-excursion'.
+
 usage: (save-excursion &rest BODY)  */)
   (Lisp_Object args)
 {