emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs-26 ab98352: Improve on last change in replace-buffer


From: Eli Zaretskii
Subject: [Emacs-diffs] emacs-26 ab98352: Improve on last change in replace-buffer-contents
Date: Sat, 30 Jun 2018 09:51:26 -0400 (EDT)

branch: emacs-26
commit ab983522a140187fa2f7bd996c6e3760b0db8d09
Author: Eli Zaretskii <address@hidden>
Commit: Eli Zaretskii <address@hidden>

    Improve on last change in replace-buffer-contents
    
    * src/editfns.c (Freplace_buffer_contents): Call modification
    hooks only for the actual region where changes are made.
    (Bug#31888)
---
 src/editfns.c | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/src/editfns.c b/src/editfns.c
index 4d3c838..9002211 100644
--- a/src/editfns.c
+++ b/src/editfns.c
@@ -3238,9 +3238,21 @@ differences between the two buffers.  */)
      Instead, we announce a single modification for the entire
      modified region.  But don't do that if the caller inhibited
      modification hooks, because then they don't want that.  */
+  ptrdiff_t from, to;
   if (!inhibit_modification_hooks)
     {
-      prepare_to_modify_buffer (BEGV, ZV, NULL);
+      ptrdiff_t k, l;
+
+      /* Find the first character position to be changed.  */
+      for (k = 0; k < size_a && !bit_is_set (ctx.deletions, k); k++)
+       ;
+      from = BEGV + k;
+
+      /* Find the last character position to be changed.  */
+      for (l = size_a; l > 0 && !bit_is_set (ctx.deletions, l - 1); l--)
+       ;
+      to = BEGV + l;
+      prepare_to_modify_buffer (from, to, NULL);
       specbind (Qinhibit_modification_hooks, Qt);
       modification_hooks_inhibited = true;
     }
@@ -3293,8 +3305,9 @@ differences between the two buffers.  */)
 
   if (modification_hooks_inhibited)
     {
-      signal_after_change (BEGV, size_a, ZV - BEGV);
-      update_compositions (BEGV, ZV, CHECK_BORDER);
+      ptrdiff_t updated_to = to + ZV - BEGV - size_a;
+      signal_after_change (from, to - from, updated_to - from);
+      update_compositions (from, updated_to, CHECK_INSIDE);
     }
 
   return Qnil;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]