]> git.eshelyaron.com Git - emacs.git/commitdiff
Avoid having font locking triggering unnecessary auto-saving
authorLars Ingebrigtsen <larsi@gnus.org>
Sat, 7 May 2022 10:05:48 +0000 (12:05 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Sat, 7 May 2022 10:05:59 +0000 (12:05 +0200)
* lisp/subr.el (with-silent-modifications): Use it to restore the
ticks (bug#11303).

* src/buffer.c (Finternal__set_buffer_modified_tick): New function.

etc/NEWS
lisp/subr.el
src/buffer.c

index f7dddd36de1dea9464d1a250c2c3e9aaa077c72a..b595eae7e10f6decaec82507ebd1d8857e58b86b 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1507,6 +1507,15 @@ Emacs buffers, like indentation and the like.  The new ert function
 \f
 * Incompatible Lisp Changes in Emacs 29.1
 
+---
+** 'with-silent-modifications' also restores buffer modification ticks.
+'with-silent-modifications' is a macro meant to be used by the font
+locking machinery to allow applying text properties without changing
+the modification status of the buffer.  However, it didn't restore the
+buffer modification ticks, so applying font locking to a modified
+buffer that had already been auto-saved would trigger another
+auto-saving.  This is no longer the case.
+
 ---
 ** 'prin1' doesn't always escape "." and "?" in symbols any more.
 Previously, symbols like 'foo.bar' would be printed by 'prin1' as
index 5af802fa18dafe7c8afb1daa96291a57afe74725..01549cc6f749c6428686de91ca76439f310afd08 100644 (file)
@@ -4594,14 +4594,19 @@ like `buffer-modified-p', checking whether the file is locked by
 someone else, running buffer modification hooks, and other things
 of that nature."
   (declare (debug t) (indent 0))
-  (let ((modified (make-symbol "modified")))
+  (let ((modified (make-symbol "modified"))
+        (tick (make-symbol "tick")))
     `(let* ((,modified (buffer-modified-p))
+            (,tick (buffer-modified-tick))
             (buffer-undo-list t)
             (inhibit-read-only t)
             (inhibit-modification-hooks t))
        (unwind-protect
            (progn
              ,@body)
+         ;; We restore the buffer tick count, too, because otherwise
+         ;; we'll trigger a new auto-save.
+         (internal--set-buffer-modified-tick ,tick)
          (unless ,modified
            (restore-buffer-modified-p nil))))))
 
index f8a7a4f5109a0796738df60ef4b37ab6c318960f..6334e197f0e2963d5993d4e3a5c452bed4e511b3 100644 (file)
@@ -1499,6 +1499,18 @@ use current buffer as BUFFER.  */)
   return modiff_to_integer (BUF_MODIFF (decode_buffer (buffer)));
 }
 
+DEFUN ("internal--set-buffer-modified-tick",
+       Finternal__set_buffer_modified_tick, Sinternal__set_buffer_modified_tick,
+       1, 2, 0,
+       doc: /* Set BUFFER's tick counter to TICK.
+No argument or nil as argument means use current buffer as BUFFER.  */)
+  (Lisp_Object tick, Lisp_Object buffer)
+{
+  CHECK_FIXNUM (tick);
+  BUF_MODIFF (decode_buffer (buffer)) = XFIXNUM (tick);
+  return Qnil;
+}
+
 DEFUN ("buffer-chars-modified-tick", Fbuffer_chars_modified_tick,
        Sbuffer_chars_modified_tick, 0, 1, 0,
        doc: /* Return BUFFER's character-change tick counter.
@@ -6418,6 +6430,7 @@ will run for `clone-indirect-buffer' calls as well.  */);
   defsubr (&Sforce_mode_line_update);
   defsubr (&Sset_buffer_modified_p);
   defsubr (&Sbuffer_modified_tick);
+  defsubr (&Sinternal__set_buffer_modified_tick);
   defsubr (&Sbuffer_chars_modified_tick);
   defsubr (&Srename_buffer);
   defsubr (&Sother_buffer);