emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] scratch/line-numbers 4c9353a: Avoid off-by-one errors in c


From: Eli Zaretskii
Subject: [Emacs-diffs] scratch/line-numbers 4c9353a: Avoid off-by-one errors in column C-n/C-p calculations
Date: Sun, 2 Jul 2017 11:03:24 -0400 (EDT)

branch: scratch/line-numbers
commit 4c9353a5840b285631a86a5bad2b48ea6276abf3
Author: Eli Zaretskii <address@hidden>
Commit: Eli Zaretskii <address@hidden>

    Avoid off-by-one errors in column C-n/C-p calculations
    
    * src/indent.c (Fvertical_motion): Help C-n/C-p estimate correctly
    the width used up by line numbers by looking near the window-start
    point.
---
 src/indent.c | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/src/indent.c b/src/indent.c
index adecc36..2cacfbb 100644
--- a/src/indent.c
+++ b/src/indent.c
@@ -2068,9 +2068,26 @@ whether or not it is currently displayed in some window. 
 */)
          start_x = window_column_x (w, window, start_col, cur_col);
        }
 
-      itdata = bidi_shelve_cache ();
+      /* When displaying line numbers, we need to prime IT's
+        lnum_width with the value calculated at window's start, since
+        that's what normal window redisplay does.  Otherwise C-n/C-p
+        will sometimes err by one column.  */
+      int lnum_width = 0;
+      if (!NILP (Vdisplay_line_numbers)
+         && !EQ (Vdisplay_line_numbers, Qvisual))
+       {
+         struct text_pos wstart;
+         SET_TEXT_POS_FROM_MARKER (wstart, w->start);
+         itdata = bidi_shelve_cache ();
+         start_display (&it, w, wstart);
+         move_it_by_lines (&it, 1);
+         lnum_width = it.lnum_width;
+         bidi_unshelve_cache (itdata, 0);
+       }
       SET_TEXT_POS (pt, PT, PT_BYTE);
+      itdata = bidi_shelve_cache ();
       start_display (&it, w, pt);
+      it.lnum_width = lnum_width;
       first_x = it.first_visible_x;
       it_start = IT_CHARPOS (it);
 



reply via email to

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