From: Eli Zaretskii Date: Sun, 13 Sep 2015 10:15:55 +0000 (+0300) Subject: Fix vertical cursor motion across overlay strings with newlines X-Git-Tag: emacs-25.0.90~1224^2~146 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=6514b30e6eb14e9d2364c08526dc8440a7412fef;p=emacs.git Fix vertical cursor motion across overlay strings with newlines * src/indent.c (Fvertical_motion): Don't leave point in the middle of an overlay string with newlines, as that will position the cursor after the string at whatever column is there. (Bug#21468) --- diff --git a/src/indent.c b/src/indent.c index 7e8f0a573a3..777cd36cc52 100644 --- a/src/indent.c +++ b/src/indent.c @@ -2195,7 +2195,30 @@ whether or not it is currently displayed in some window. */) was originally hscrolled, the goal column is interpreted as an addition to the hscroll amount. */ if (lcols_given) - move_it_in_display_line (&it, ZV, first_x + to_x, MOVE_TO_X); + { + move_it_in_display_line (&it, ZV, first_x + to_x, MOVE_TO_X); + /* If we find ourselves in the middle of an overlay string + which includes a newline after current string position, + we need to move by lines until we get out of the string, + and then reposition point at the requested X coordinate; + if we don't, the cursor will be placed just after the + string, which might not be the requested column. */ + if (nlines > 0 + && it.method == GET_FROM_STRING + && !it.string_from_display_prop_p + && it.area == TEXT_AREA) + { + while (it.method == GET_FROM_STRING + && !it.string_from_display_prop_p + && memchr (SSDATA (it.string) + IT_STRING_BYTEPOS (it), + '\n', + SBYTES (it.string) - IT_STRING_BYTEPOS (it))) + { + move_it_by_lines (&it, 1); + move_it_in_display_line (&it, ZV, first_x + to_x, MOVE_TO_X); + } + } + } SET_PT_BOTH (IT_CHARPOS (it), IT_BYTEPOS (it)); bidi_unshelve_cache (itdata, 0);