diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/xdisp.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/src/xdisp.c b/src/xdisp.c index b1b2fd6bc59..4760893d284 100644 --- a/src/xdisp.c +++ b/src/xdisp.c | |||
| @@ -5404,12 +5404,24 @@ move_it_vertically_backward (it, dy) | |||
| 5404 | else if (target_y >= it->current_y + line_height | 5404 | else if (target_y >= it->current_y + line_height |
| 5405 | && IT_CHARPOS (*it) < ZV) | 5405 | && IT_CHARPOS (*it) < ZV) |
| 5406 | { | 5406 | { |
| 5407 | /* Should move forward by at least one line, maybe more. */ | 5407 | /* Should move forward by at least one line, maybe more. |
| 5408 | do | 5408 | |
| 5409 | Note: Calling move_it_by_lines can be expensive on | ||
| 5410 | terminal frames, where compute_motion is used (via | ||
| 5411 | vmotion) to do the job, when there are very long lines | ||
| 5412 | and truncate-lines is nil. That's the reason for | ||
| 5413 | treating terminal frames specially here. */ | ||
| 5414 | |||
| 5415 | if (!FRAME_WINDOW_P (it->f)) | ||
| 5416 | move_it_vertically (it, target_y - (it->current_y + line_height)); | ||
| 5417 | else | ||
| 5409 | { | 5418 | { |
| 5410 | move_it_by_lines (it, 1, 1); | 5419 | do |
| 5420 | { | ||
| 5421 | move_it_by_lines (it, 1, 1); | ||
| 5422 | } | ||
| 5423 | while (target_y >= line_bottom_y (it) && IT_CHARPOS (*it) < ZV); | ||
| 5411 | } | 5424 | } |
| 5412 | while (target_y >= line_bottom_y (it) && IT_CHARPOS (*it) < ZV); | ||
| 5413 | 5425 | ||
| 5414 | xassert (IT_CHARPOS (*it) >= BEGV); | 5426 | xassert (IT_CHARPOS (*it) >= BEGV); |
| 5415 | } | 5427 | } |