[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);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] scratch/line-numbers 4c9353a: Avoid off-by-one errors in column C-n/C-p calculations,
Eli Zaretskii <=