diff --git a/src/indent.c b/src/indent.c index 507b8e36cbe..66392353828 100644 --- a/src/indent.c +++ b/src/indent.c @@ -997,6 +997,8 @@ compute_motion (from, fromvpos, fromhpos, did_motion, to, tovpos, tohpos, width, { while (pos == next_boundary) { + int newpos; + /* If the caller says that the screen position came from an earlier call to compute_motion, then we've already accounted for the overlay strings at point. This is only true the first time @@ -1020,7 +1022,12 @@ compute_motion (from, fromvpos, fromhpos, did_motion, to, tovpos, tohpos, width, (but not necessarily all that there are here), and store in next_boundary the next position where we need to call skip_invisible. */ - pos = skip_invisible (pos, &next_boundary, to, window); + newpos = skip_invisible (pos, &next_boundary, to, window); + + if (newpos >= to) + goto after_loop; + + pos = newpos; } /* Handle right margin. */ @@ -1361,6 +1368,8 @@ compute_motion (from, fromvpos, fromhpos, did_motion, to, tovpos, tohpos, width, } } + after_loop: + /* Remember any final width run in the cache. */ if (current_buffer->width_run_cache && width_run_width == 1