changeset 104880:02bf3383a22f

(with-silent-modifications): New macro.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Tue, 08 Sep 2009 19:42:21 +0000
parents eccd5fb371c2
children 98356e8ba345
files etc/NEWS lisp/ChangeLog lisp/subr.el
diffstat 3 files changed, 29 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/etc/NEWS	Mon Sep 07 15:25:38 2009 +0000
+++ b/etc/NEWS	Tue Sep 08 19:42:21 2009 +0000
@@ -200,6 +200,8 @@
 
 * Lisp changes in Emacs 23.2
 
+** New macro with-silent-modifications to tweak text properties without
+affecting the buffer's modification state.
 ** All the default-FOO variables that hold the default value of the FOO
 variable, are now declared obsolete.
 
--- a/lisp/ChangeLog	Mon Sep 07 15:25:38 2009 +0000
+++ b/lisp/ChangeLog	Tue Sep 08 19:42:21 2009 +0000
@@ -1,3 +1,7 @@
+2009-09-08  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* subr.el (with-silent-modifications): New macro.
+
 2009-09-07  Juanma Barranquero  <lekktu@gmail.com>
 
 	* files.el (top-level): Require `cl' when compiling.
--- a/lisp/subr.el	Mon Sep 07 15:25:38 2009 +0000
+++ b/lisp/subr.el	Tue Sep 08 19:42:21 2009 +0000
@@ -2749,6 +2749,29 @@
            (and (buffer-name ,temp-buffer)
                 (kill-buffer ,temp-buffer)))))))
 
+(defmacro with-silent-modifications (&rest body)
+  "Execute BODY, pretending it does not modifies the buffer.
+If BODY performs real modifications to the buffer's text, other
+than cosmetic ones, undo data may become corrupted.
+Typically used around modifications of text-properties which do not really
+affect the buffer's content."
+  (declare (debug t) (indent 0))
+  (let ((modified (make-symbol "modified")))
+    `(let* ((,modified (buffer-modified-p))
+            (buffer-undo-list t)
+            (inhibit-read-only t)
+            (inhibit-modification-hooks t)
+            deactivate-mark
+            ;; Avoid setting and removing file locks and checking
+            ;; buffer's uptodate-ness w.r.t the underlying file.
+            buffer-file-name
+            buffer-file-truename)
+       (unwind-protect
+           (progn
+             ,@body)
+         (unless ,modified
+           (restore-buffer-modified-p nil))))))
+
 (defmacro with-output-to-string (&rest body)
   "Execute BODY, return the text it sent to `standard-output', as a string."
   (declare (indent 0) (debug t))