]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve narrowing when iterator has moved outside of narrowing bounds.
authorGregory Heytings <gregory@heytings.org>
Fri, 29 Jul 2022 16:23:16 +0000 (16:23 +0000)
committerGregory Heytings <gregory@heytings.org>
Fri, 29 Jul 2022 16:28:44 +0000 (18:28 +0200)
* src/xdisp.c (get_narrowed_begv, get_narrowed_zv): Add 'pos'
parameter.
(init_iterator): Add arguments to 'get_narrowed_begv' and
'get_narrowed_zv'.
(handle_fontified_prop): Recompute the narrowing when iterator
has moved outside of narrowing bounds.

* src/dispextern.h (get_narrowed_begv, get_narrowed_zv): Adapt
prototypes.

* src/composite.c (find_automatic_composition): Add argument
to 'get_narrowed_begv'.

src/composite.c
src/dispextern.h
src/xdisp.c

index b04d34337b422d589bb16b7b0c09565a13db90e4..0f90b92a7854f76ab198c0cb3669b7d460e5651e 100644 (file)
@@ -1599,7 +1599,7 @@ find_automatic_composition (ptrdiff_t pos, ptrdiff_t limit, ptrdiff_t backlim,
        head = backlim;
       /* In buffers with very long lines, this function becomes very
         slow.  Pretend that the buffer is narrowed to make it fast.  */
-      narrowed_begv = get_narrowed_begv (w);
+      narrowed_begv = get_narrowed_begv (w, window_point (w));
       if (narrowed_begv && pos > narrowed_begv)
        head = narrowed_begv;
       tail = ZV;
index 2772e8cda8d2784d58b604b14ff489211bf5b683..817211e795eb2dcc34bed9a9d2f6a64c6a09fbb4 100644 (file)
@@ -3404,8 +3404,8 @@ void mark_window_display_accurate (Lisp_Object, bool);
 void redisplay_preserve_echo_area (int);
 void init_iterator (struct it *, struct window *, ptrdiff_t,
                     ptrdiff_t, struct glyph_row *, enum face_id);
-ptrdiff_t get_narrowed_begv (struct window *);
-ptrdiff_t get_narrowed_zv (struct window *);
+ptrdiff_t get_narrowed_begv (struct window *, ptrdiff_t);
+ptrdiff_t get_narrowed_zv (struct window *, ptrdiff_t);
 ptrdiff_t get_closer_narrowed_begv (struct window *, ptrdiff_t);
 void init_iterator_to_row_start (struct it *, struct window *,
                                  struct glyph_row *);
index 9580e596012d673560466c9e6498b6a14c48e4e8..cdef90b6868234bbf1ee6cb3323fac390d9fddf5 100644 (file)
@@ -3427,8 +3427,8 @@ init_iterator (struct it *it, struct window *w,
 
   if (current_buffer->long_line_optimizations_p)
     {
-      it->narrowed_begv = get_narrowed_begv (w);
-      it->narrowed_zv = get_narrowed_zv (w);
+      it->narrowed_begv = get_narrowed_begv (w, window_point (w));
+      it->narrowed_zv = get_narrowed_zv (w, window_point (w));
     }
 
   /* If a buffer position was specified, set the iterator there,
@@ -3519,19 +3519,19 @@ get_narrowed_len (struct window *w)
 }
 
 ptrdiff_t
-get_narrowed_begv (struct window *w)
+get_narrowed_begv (struct window *w, ptrdiff_t pos)
 {
   int len = get_narrowed_len (w);
   ptrdiff_t begv;
-  begv = max ((window_point (w) / len - 1) * len, BEGV);
+  begv = max ((pos / len - 1) * len, BEGV);
   return begv == BEGV ? 0 : begv;
 }
 
 ptrdiff_t
-get_narrowed_zv (struct window *w)
+get_narrowed_zv (struct window *w, ptrdiff_t pos)
 {
   int len = get_narrowed_len (w);
-  return min ((window_point (w) / len + 1) * len, ZV);
+  return min ((pos / len + 1) * len, ZV);
 }
 
 ptrdiff_t
@@ -4408,9 +4408,17 @@ handle_fontified_prop (struct it *it)
       eassert (it->end_charpos == ZV);
 
       if (current_buffer->long_line_optimizations_p)
-       Fnarrow_to_region (make_fixnum (it->narrowed_begv ?
-                                       it->narrowed_begv : BEGV),
-                          make_fixnum (it->narrowed_zv), Qt);
+       {
+         ptrdiff_t begv = it->narrowed_begv ? it->narrowed_begv : BEGV;
+         ptrdiff_t zv = it->narrowed_zv;
+         ptrdiff_t charpos = IT_CHARPOS (*it);
+         if (charpos < begv || charpos > zv)
+           {
+             begv = get_narrowed_begv (it->w, charpos);
+             zv = get_narrowed_zv (it->w, charpos);
+           }
+         Fnarrow_to_region (make_fixnum (begv), make_fixnum (zv), Qt);
+       }
 
       /* Don't allow Lisp that runs from 'fontification-functions'
         clear our face and image caches behind our back.  */