]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix vertical-motion and posn-at-point when word-wrap is on (Bug#19769)
authorEli Zaretskii <eliz@gnu.org>
Thu, 5 Feb 2015 17:07:15 +0000 (19:07 +0200)
committerEli Zaretskii <eliz@gnu.org>
Thu, 5 Feb 2015 17:07:15 +0000 (19:07 +0200)
 src/xdisp.c (move_it_in_display_line_to): Handle the case where the
 last character of a screen line is whitespace, and we are under
 word-wrap with overflow-newline-into-fringe turned on.

src/ChangeLog
src/xdisp.c

index 8e7ab9363f64db88a891187357dcd0a4e11f7d13..135f28fb20f2e28d50225ef8774fc3068a2a3b02 100644 (file)
@@ -1,3 +1,10 @@
+2015-02-05  Eli Zaretskii  <eliz@gnu.org>
+
+       * xdisp.c (move_it_in_display_line_to): Handle the case where the
+       last character of a screen line is whitespace, and we are under
+       word-wrap with overflow-newline-into-fringe turned on.
+       (Bug#19769)
+
 2015-02-03  Eli Zaretskii  <eliz@gnu.org>
 
        * xdisp.c (handle_stop, handle_single_display_spec)
index 5e552ca2fdb913da308b7eded1b615eb4ce8c6e1..8cb43538dccd5473f01a9eac7a6f4e04d10f715b 100644 (file)
@@ -8798,7 +8798,16 @@ move_it_in_display_line_to (struct it *it,
                          if (BUFFER_POS_REACHED_P ())
                            {
                              if (it->line_wrap != WORD_WRAP
-                                 || wrap_it.sp < 0)
+                                 || wrap_it.sp < 0
+                                 /* If we've just found whitespace to
+                                    wrap, effectively ignore the
+                                    previous wrap point -- it is no
+                                    longer relevant, but we won't
+                                    have an opportunity to update it,
+                                    since we've reached the edge of
+                                    this screen line.  */
+                                 || (may_wrap
+                                     && IT_OVERFLOW_NEWLINE_INTO_FRINGE (it)))
                                {
                                  it->hpos = hpos_before_this_char;
                                  it->current_x = x_before_this_char;
@@ -8862,7 +8871,26 @@ move_it_in_display_line_to (struct it *it,
                  else
                    IT_RESET_X_ASCENT_DESCENT (it);
 
-                 if (wrap_it.sp >= 0)
+                 /* If the screen line ends with whitespace, and we
+                    are under word-wrap, don't use wrap_it: it is no
+                    longer relevant, but we won't have an opportunity
+                    to update it, since we are done with this screen
+                    line.  */
+                 if (may_wrap && IT_OVERFLOW_NEWLINE_INTO_FRINGE (it))
+                   {
+                     /* If we've found TO_X, go back there, as we now
+                        know the last word fits on this screen line.  */
+                     if ((op & MOVE_TO_X) && new_x == it->last_visible_x
+                         && atx_it.sp >= 0)
+                       {
+                         RESTORE_IT (it, &atx_it, atx_data);
+                         atpos_it.sp = -1;
+                         atx_it.sp = -1;
+                         result = MOVE_X_REACHED;
+                         break;
+                       }
+                   }
+                 else if (wrap_it.sp >= 0)
                    {
                      RESTORE_IT (it, &wrap_it, wrap_data);
                      atpos_it.sp = -1;