# HG changeset patch # User Chong Yidong # Date 1159298735 0 # Node ID c85ee72ad64bf36f1b110c19d4436f8dbb2eecb5 # Parent 1ae580684ad100fdb4bac4df9d7b31587055655a * indent.c (Fvertical_motion): Do move back if the Lisp string being displayed contains newlines. diff -r 1ae580684ad1 -r c85ee72ad64b src/ChangeLog --- a/src/ChangeLog Tue Sep 26 18:05:41 2006 +0000 +++ b/src/ChangeLog Tue Sep 26 19:25:35 2006 +0000 @@ -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 -r 1ae580684ad1 -r c85ee72ad64b src/indent.c --- a/src/indent.c Tue Sep 26 18:05:41 2006 +0000 +++ b/src/indent.c Tue Sep 26 19:25:35 2006 +0000 @@ -2074,7 +2074,7 @@ { 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 @@ 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 @@ /* 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;