]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve the heuristic for long lines detection.
authorGregory Heytings <gregory@heytings.org>
Mon, 18 Jul 2022 15:50:57 +0000 (15:50 +0000)
committerGregory Heytings <gregory@heytings.org>
Mon, 18 Jul 2022 15:54:55 +0000 (17:54 +0200)
* src/buffer.h (struct buffer_text): New 'unchanged_size' field.
(BUF_UNCHANGED_SIZE): New macro to access the field.

* src/buffer.c (Fget_buffer_create): Initialize the field.
(Fbuffer_swap_text): Handle it.

* src/xdisp.c (mark_window_display_accurate_1): Set the field.
(redisplay_window): Use the field for long lines detection.

src/buffer.c
src/buffer.h
src/xdisp.c

index a777668e44b0225178679363031ecda677ec9332..9a463363b93036c3181fdf0582db448a8c8de97d 100644 (file)
@@ -599,6 +599,7 @@ even if it is dead.  The return value is never nil.  */)
   BUF_OVERLAY_UNCHANGED_MODIFIED (b) = 1;
   BUF_END_UNCHANGED (b) = 0;
   BUF_BEG_UNCHANGED (b) = 0;
+  BUF_UNCHANGED_SIZE (b) = 0;
   *(BUF_GPT_ADDR (b)) = *(BUF_Z_ADDR (b)) = 0; /* Put an anchor '\0'.  */
   b->text->inhibit_shrinking = false;
   b->text->redisplay = false;
@@ -2476,6 +2477,11 @@ results, see Info node `(elisp)Swapping Text'.  */)
   current_buffer->text->end_unchanged = current_buffer->text->gpt;
   other_buffer->text->beg_unchanged = other_buffer->text->gpt;
   other_buffer->text->end_unchanged = other_buffer->text->gpt;
+  {
+    ptrdiff_t tmp = current_buffer->text->unchanged_size;
+    current_buffer->text->unchanged_size = other_buffer->text->unchanged_size;
+    other_buffer->text->unchanged_size = tmp;
+  }
   {
     struct Lisp_Marker *m;
     for (m = BUF_MARKERS (current_buffer); m; m = m->next)
index 09daa29992adc7e4ee82491807ac29b98926b11c..c2dca0a10c119c8a418e5dc5eb0c2e0a5f8656e3 100644 (file)
@@ -144,6 +144,9 @@ enum { BEG = 1, BEG_BYTE = BEG };
 #define BUF_UNCHANGED_MODIFIED(buf) \
   ((buf)->text->unchanged_modified)
 
+#define BUF_UNCHANGED_SIZE(buf) \
+  ((buf)->text->unchanged_size)
+
 #define BUF_OVERLAY_UNCHANGED_MODIFIED(buf) \
   ((buf)->text->overlay_unchanged_modified)
 #define BUF_BEG_UNCHANGED(buf) ((buf)->text->beg_unchanged)
@@ -267,6 +270,9 @@ struct buffer_text
        end_unchanged contain no useful information.  */
     modiff_count overlay_unchanged_modified;
 
+    /* Buffer size as of last redisplay that finished.  */
+    ptrdiff_t unchanged_size;
+
     /* Properties of this buffer's text.  */
     INTERVAL intervals;
 
index 572ad2b85405e4e10eeea57a8447b1d2822e96f8..375158a5204993c1e6ae4463042ba9ec078c0597 100644 (file)
@@ -17074,6 +17074,7 @@ mark_window_display_accurate_1 (struct window *w, bool accurate_p)
       BUF_OVERLAY_UNCHANGED_MODIFIED (b) = BUF_OVERLAY_MODIFF (b);
       BUF_BEG_UNCHANGED (b) = BUF_GPT (b) - BUF_BEG (b);
       BUF_END_UNCHANGED (b) = BUF_Z (b) - BUF_GPT (b);
+      BUF_UNCHANGED_SIZE (b) = BUF_Z (b) - BUF_BEG (b);
 
       w->current_matrix->buffer = b;
       w->current_matrix->begv = BUF_BEGV (b);
@@ -19279,7 +19280,7 @@ redisplay_window (Lisp_Object window, bool just_this_one_p)
   /* Check whether the buffer to be displayed contains long lines.  */
   if (!NILP (Vlong_line_threshold)
       && !current_buffer->long_line_optimizations_p
-      && MODIFF != UNCHANGED_MODIFIED)
+      && Z - BEG - BUF_UNCHANGED_SIZE (current_buffer) <= 1)
     {
       ptrdiff_t cur, next, found, max = 0;
       for (cur = 1; cur < Z; cur = next)