Fix bug #11133 with vertical-motion across a long display string.

src/indent.c (Fvertical_motion): If there is a display string at
 point, use it.vpos to compute how many lines to backtrack after 
 move_it_to point.
This commit is contained in:
Eli Zaretskii 2012-04-07 10:54:56 +03:00
parent 2f8e16b2a3
commit 3811fdf3e8
2 changed files with 19 additions and 1 deletions

View file

@ -1,3 +1,9 @@
2012-04-07 Eli Zaretskii <eliz@gnu.org>
* indent.c (Fvertical_motion): If there is a display string at
point, use it.vpos to compute how many lines to backtrack after
move_it_to point. (Bug#11133)
2012-04-06 Eli Zaretskii <eliz@gnu.org>
* buffer.h (FETCH_CHAR, FETCH_MULTIBYTE_CHAR):

View file

@ -2021,6 +2021,7 @@ whether or not it is currently displayed in some window. */)
EMACS_INT it_start;
int first_x, it_overshoot_count = 0;
int overshoot_handled = 0;
int disp_string_at_start_p = 0;
itdata = bidi_shelve_cache ();
SET_TEXT_POS (pt, PT, PT_BYTE);
@ -2035,6 +2036,8 @@ whether or not it is currently displayed in some window. */)
{
const char *s = SSDATA (it.string);
const char *e = s + SBYTES (it.string);
disp_string_at_start_p = it.string_from_display_prop_p;
while (s < e)
{
if (*s++ == '\n')
@ -2062,7 +2065,8 @@ whether or not it is currently displayed in some window. */)
/* IT may move too far if truncate-lines is on and PT lies
beyond the right margin. IT may also move too far if the
starting point is on a Lisp string that has embedded
newlines. In these cases, backtrack. */
newlines, or spans several screen lines. In these cases,
backtrack. */
if (IT_CHARPOS (it) > it_start)
{
/* We need to backtrack also if the Lisp string contains no
@ -2073,6 +2077,14 @@ whether or not it is currently displayed in some window. */)
&& it.method == GET_FROM_BUFFER
&& it.c == '\n')
it_overshoot_count = 1;
else if (disp_string_at_start_p && it.vpos > 0)
{
/* This is the case of a display string that spans
several screen lines. In that case, we end up at the
end of the string, and it.vpos tells us how many
screen lines we need to backtrack. */
it_overshoot_count = it.vpos;
}
if (it_overshoot_count > 0)
move_it_by_lines (&it, -it_overshoot_count);