From: Eli Zaretskii Date: Sat, 13 Apr 2013 08:54:02 +0000 (+0300) Subject: Fix vertical cursor motion when there are overlay strings at EOL. X-Git-Tag: emacs-24.3.90~173^2^2~42^2~45^2~387^2~2026^2~481 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=29b79ba19785cf3d5bbb3779779ca3a7714ee2e1;p=emacs.git Fix vertical cursor motion when there are overlay strings at EOL. src/indent.c (Fvertical_motion): Don't consider display strings on overlay strings as display strings on the buffer position we started from. This prevents vertical cursor motion from jumping more than one line when there's an overlay string with a display property at end of line. Reported by Karl Chen in http://lists.gnu.org/archive/html/emacs-devel/2013-04/msg00362.html. --- diff --git a/src/ChangeLog b/src/ChangeLog index 08f33eb7d02..af2d38d2e87 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,13 @@ +2013-04-13 Eli Zaretskii + + * indent.c (Fvertical_motion): Don't consider display strings on + overlay strings as display strings on the buffer position we + started from. This prevents vertical cursor motion from jumping + more than one line when there's an overlay string with a display + property at end of line. + Reported by Karl Chen in + http://lists.gnu.org/archive/html/emacs-devel/2013-04/msg00362.html. + 2013-04-12 Stefan Monnier * window.c (select_window): `record_buffer' even if window is diff --git a/src/indent.c b/src/indent.c index 67796ab8a8f..47358e17db8 100644 --- a/src/indent.c +++ b/src/indent.c @@ -2006,11 +2006,15 @@ 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 = /* If it.area is anything but TEXT_AREA, we need not bother about the display string, as it doesn't affect cursor positioning. */ - disp_string_at_start_p = - it.string_from_display_prop_p && it.area == TEXT_AREA; + it.area == TEXT_AREA + && it.string_from_display_prop_p + /* A display string on anything but buffer text (e.g., on + an overlay string) doesn't affect cursor positioning. */ + && (it.sp > 0 && it.stack[it.sp - 1].method == GET_FROM_BUFFER); while (s < e) { if (*s++ == '\n')