From 14a7cabfbcb902f8ba56de56a27168d1b8e0d640 Mon Sep 17 00:00:00 2001 From: Chong Yidong Date: Tue, 26 Sep 2006 19:25:35 +0000 Subject: [PATCH] * indent.c (Fvertical_motion): Do move back if the Lisp string being displayed contains newlines. --- src/ChangeLog | 5 +++++ src/indent.c | 30 +++++++++++++++++++++++------- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 147d3533886..5f919ffedef 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2006-09-26 Chong Yidong + + * indent.c (Fvertical_motion): Do move back if the Lisp string + being displayed contains newlines. + 2006-09-26 YAMAMOTO Mitsuharu * macterm.c (mac_compute_glyph_string_overhangs, XLoadQueryFont) diff --git a/src/indent.c b/src/indent.c index c302c5313e7..3cbb105e80f 100644 --- a/src/indent.c +++ b/src/indent.c @@ -2074,7 +2074,7 @@ whether or not it is currently displayed in some window. */) { int it_start; int oselective; - int start_on_image_or_stretch_or_string_p; + int it_overshoot_expected_p; SET_TEXT_POS (pt, PT, PT_BYTE); start_display (&it, w, pt); @@ -2086,9 +2086,26 @@ whether or not it is currently displayed in some window. */) while the end position is really at some X > 0, the same X that PT had. */ it_start = IT_CHARPOS (it); - start_on_image_or_stretch_or_string_p = (it.method == GET_FROM_IMAGE - || it.method == GET_FROM_STRETCH - || it.method == GET_FROM_STRING); + + /* We expect the call to move_it_to, further down, to overshoot + if the starting point is on an image, stretch glyph, or Lisp + string. We won't need to backtrack in this situation, except + for one corner case: when the Lisp string contains a + newline. */ + if (it.method == GET_FROM_STRING) + { + const char *s = SDATA (it.string); + const char *e = s + SBYTES (it.string); + + while (s < e && *s != '\n') + ++s; + + it_overshoot_expected_p = (s == e); + } + else + it_overshoot_expected_p = (it.method == GET_FROM_IMAGE + || it.method == GET_FROM_STRETCH); + reseat_at_previous_visible_line_start (&it); it.current_x = it.hpos = 0; /* Temporarily disable selective display so we don't move too far */ @@ -2099,10 +2116,9 @@ whether or not it is currently displayed in some window. */) /* Move back if we got too far. This may happen if truncate-lines is on and PT is beyond right margin. - It may also happen if it_start is on an image, stretch - glyph, or string -- in that case, don't go back. */ + Don't go back if the overshoot is expected (see above). */ if (IT_CHARPOS (it) > it_start && XINT (lines) > 0 - && !start_on_image_or_stretch_or_string_p) + && !it_overshoot_expected_p) move_it_by_lines (&it, -1, 0); it.vpos = 0; -- 2.39.2