diff options
author | Eli Zaretskii <eliz@gnu.org> | 2015-02-05 19:07:15 +0200 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2015-02-05 19:07:15 +0200 |
commit | c0ba5908b117170995df36e839a087af7c5f79db (patch) | |
tree | b610585c4266f90f45a4b614f304cf39e24f1798 | |
parent | a323b93d466c403cbef96184d510b134549c7806 (diff) | |
download | emacs-c0ba5908b117170995df36e839a087af7c5f79db.tar.gz |
Fix vertical-motion and posn-at-point when word-wrap is on (Bug#19769)
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.
-rw-r--r-- | src/ChangeLog | 7 | ||||
-rw-r--r-- | src/xdisp.c | 32 |
2 files changed, 37 insertions, 2 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 8e7ab9363f6..135f28fb20f 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -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) diff --git a/src/xdisp.c b/src/xdisp.c index 5e552ca2fdb..8cb43538dcc 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -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; |