]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix bug #11133 with vertical-motion across a long display string.
authorEli Zaretskii <eliz@gnu.org>
Sat, 7 Apr 2012 07:54:56 +0000 (10:54 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sat, 7 Apr 2012 07:54:56 +0000 (10:54 +0300)
 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.

src/ChangeLog
src/indent.c

index af65d38a33b31c42fcab4deb1e53d825084c88e3..6bd946c090095c63633a058d20490f015314e65f 100644 (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):
index a1fcd2b10181d402b54ca8682ee515a328fc5929..9b4279f0c4e6377341c14167d88131ad588070a7 100644 (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);