]> git.eshelyaron.com Git - emacs.git/commitdiff
Really fix bug #9224 with vertical-motion under word-wrap.
authorEli Zaretskii <eliz@gnu.org>
Sat, 6 Aug 2011 11:49:35 +0000 (14:49 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sat, 6 Aug 2011 11:49:35 +0000 (14:49 +0300)
 src/xdisp.c (move_it_in_display_line_to): Fix vertical-motion in a buffer
 with word-wrap under bidirectional display.

src/ChangeLog
src/xdisp.c

index efe542e37d08abea5788f142a9a03aca4e285ebe..039c225c1f648a58771fb53432c85a18b25669e3 100644 (file)
@@ -3,6 +3,8 @@
        * xdisp.c (set_cursor_from_row): Fix cursor positioning when a
        display property strides EOL and includes a newline, as in
        longlines-mode.  (Bug#9254)
+       (move_it_in_display_line_to): Fix vertical-motion in a buffer with
+       word-wrap under bidirectional display.  (Bug#9224)
 
        * bidi.c (bidi_unshelve_cache): Don't reset the cache if JUST_FREE
        is non-zero, even if the data buffer is NULL.  Fixes a crash in
index 9c281c6736b28a128f74a5b02e0edac59ee45382..6e9474e3c1010d2c7d483869fe174543d945a2b0 100644 (file)
@@ -8009,13 +8009,19 @@ move_it_in_display_line_to (struct it *it,
             positions smaller than TO_CHARPOS, return
             MOVE_POS_MATCH_OR_ZV, like the unidirectional display
             did.  */
-         if (it->bidi_p && (op & MOVE_TO_POS) != 0
-             && !saw_smaller_pos
-             && IT_CHARPOS (*it) > to_charpos)
+         if (it->bidi_p && (op & MOVE_TO_POS) != 0)
            {
-             if (IT_CHARPOS (ppos_it) < ZV)
-               RESTORE_IT (it, &ppos_it, ppos_data);
-             goto buffer_pos_reached;
+             if (!saw_smaller_pos && IT_CHARPOS (*it) > to_charpos)
+               {
+                 if (IT_CHARPOS (ppos_it) < ZV)
+                   RESTORE_IT (it, &ppos_it, ppos_data);
+                 goto buffer_pos_reached;
+               }
+             else if (it->line_wrap == WORD_WRAP && atpos_it.sp >= 0
+                      && IT_CHARPOS (*it) > to_charpos)
+               goto buffer_pos_reached;
+             else
+               result = MOVE_NEWLINE_OR_CR;
            }
          else
            result = MOVE_NEWLINE_OR_CR;