Subject: Re: bug#1501: Emacs 22 loses undo buffer

From: Stefan Kangas <[email-masked]>
Date: Tue, 19 Oct 2021 18:01:43 -0700

tags 1501 + patch
thanks

Noam Postavsky <[email-masked]> writes:

> Stefan Kangas <[email-masked]> writes:
>
>> Noam Postavsky <[email-masked]> writes:
>>
>>> Stefan Kangas <[email-masked]> writes:
>>>
>>> > increase in the memory usage of each undo record, especially when
>>> > using font-lock-mode.  I'm not sure that is a serious problem, since
>>> > memory is only getting cheaper, but it might be worth investigating.
>>> > On the other hand, we could just decide that this is not worth the
>>> > effort and close this as wontfix.
>>>
>>> Hmm, it sounds like the problem might just be due to saving text
>>> properties in the undo records?  If so, maybe a simple fix is to just
>>> drop them (or drop only face and font-lock-face properties).
>>
>> Is it not worth saving also that information?
>
> Definitely not face, since it's overwritten as soon as font-lock runs.
> It's true font-lock-face can sometimes be set manually, though usually
> it's computed by font-lock rules.

This would be fairly simple to do, as in the attached patch.  But I'm
not sure that we should make this change, since both `face' and
`font-lock-face' could be used by a major mode at various times, without
getting automatically re-added by font-lock.

>From (info "(elisp) Precalculated Fontification"):

    But if the mode does not use the normal Font Lock machinery, it
    should not set the variable ‘font-lock-defaults’.  In this case the
    ‘face’ property will not be overridden, so using the ‘face’ property
    could work too.

IOW, I'm not sure that the proposed change won't introduce subtle bugs.

Other than that, we have doubled all undo limits in Emacs 27.1, so maybe
that's enough of a fix for now?

Any other opinions?
From 7b0fea42f793d7b7f9fa9938b3c99b1f28323531 Mon Sep 17 00:00:00 2001
From: Stefan Kangas <[email-masked]>
Date: Wed, 20 Oct 2021 02:42:31 +0200
Subject: [PATCH] Decrease size of undo entries

* src/undo.c (record_delete): Remove the 'face' property from undo
entries to save space.  (Bug1501)
---
 src/undo.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/undo.c b/src/undo.c
index 2db401ebc7..260cf792c7 100644
--- a/src/undo.c
+++ b/src/undo.c
@@ -164,6 +164,13 @@ record_delete (ptrdiff_t beg, Lisp_Object string, bool record_markers)
 {
   Lisp_Object sbeg;
 
+  /* Remove the `face' property to save space.  (Bug1501)  */
+  if (!NILP (string))
+    Fremove_list_of_text_properties (make_fixnum (0),
+				     make_fixnum (SCHARS (string)),
+				     CALLN (Flist, Qface),
+				     string);
+
   if (EQ (BVAR (current_buffer, undo_list), Qt))
     return;
 
-- 
2.30.2