0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 9.0.1309: scrolling two lines with even line count and 'scrolloff' set

Problem:    Scrolling two lines with even line count and 'scrolloff' set.
Solution:   Adjust how the topline is computed. (closes #10545)
This commit is contained in:
Bram Moolenaar
2023-02-14 17:41:20 +00:00
parent 1a6476428f
commit 1d6539cf36
11 changed files with 92 additions and 54 deletions

View File

@@ -1953,7 +1953,7 @@ enter_buffer(buf_T *buf)
maketitle(); maketitle();
// when autocmds didn't change it // when autocmds didn't change it
if (curwin->w_topline == 1 && !curwin->w_topline_was_set) if (curwin->w_topline == 1 && !curwin->w_topline_was_set)
scroll_cursor_halfway(FALSE); // redisplay at correct position scroll_cursor_halfway(FALSE, FALSE); // redisplay at correct position
#ifdef FEAT_NETBEANS_INTG #ifdef FEAT_NETBEANS_INTG
// Send fileOpened event because we've changed buffers. // Send fileOpened event because we've changed buffers.

View File

@@ -396,7 +396,7 @@ update_topline(void)
// cursor in the middle of the window. Otherwise put the cursor // cursor in the middle of the window. Otherwise put the cursor
// near the top of the window. // near the top of the window.
if (n >= halfheight) if (n >= halfheight)
scroll_cursor_halfway(FALSE); scroll_cursor_halfway(FALSE, FALSE);
else else
{ {
scroll_cursor_top(scrolljump_value(), FALSE); scroll_cursor_top(scrolljump_value(), FALSE);
@@ -499,7 +499,7 @@ update_topline(void)
if (line_count <= curwin->w_height + 1) if (line_count <= curwin->w_height + 1)
scroll_cursor_bot(scrolljump_value(), FALSE); scroll_cursor_bot(scrolljump_value(), FALSE);
else else
scroll_cursor_halfway(FALSE); scroll_cursor_halfway(FALSE, FALSE);
} }
} }
} }
@@ -2383,7 +2383,7 @@ scroll_cursor_top(int min_scroll, int always)
* in a small window. * in a small window.
*/ */
if (used > curwin->w_height) if (used > curwin->w_height)
scroll_cursor_halfway(FALSE); scroll_cursor_halfway(FALSE, FALSE);
else else
{ {
/* /*
@@ -2720,7 +2720,7 @@ scroll_cursor_bot(int min_scroll, int set_topbot)
* Otherwise put it at 1/2 of the screen. * Otherwise put it at 1/2 of the screen.
*/ */
if (line_count >= curwin->w_height && line_count > min_scroll) if (line_count >= curwin->w_height && line_count > min_scroll)
scroll_cursor_halfway(FALSE); scroll_cursor_halfway(FALSE, TRUE);
else else
{ {
// With 'smoothscroll' scroll at least the height of the cursor line, // With 'smoothscroll' scroll at least the height of the cursor line,
@@ -2760,7 +2760,7 @@ scroll_cursor_bot(int min_scroll, int set_topbot)
* If "atend" is TRUE, also put it halfway at the end of the file. * If "atend" is TRUE, also put it halfway at the end of the file.
*/ */
void void
scroll_cursor_halfway(int atend) scroll_cursor_halfway(int atend, int prefer_above)
{ {
int above = 0; int above = 0;
linenr_T topline; linenr_T topline;
@@ -2841,43 +2841,62 @@ scroll_cursor_halfway(int atend)
// If not using smoothscroll, we have to iteratively find how many // If not using smoothscroll, we have to iteratively find how many
// lines to scroll down to roughly fit the cursor. // lines to scroll down to roughly fit the cursor.
// This may not be right in the middle if the lines' physical height > // This may not be right in the middle if the lines'
// 1 (e.g. 'wrap' is on). // physical height > 1 (e.g. 'wrap' is on).
if (below <= above) // add a line below the cursor first // Depending on "prefer_above" we add a line above or below first.
// Loop twice to avoid duplicating code.
int done = FALSE;
for (int round = 1; round <= 2; ++round)
{ {
if (boff.lnum < curbuf->b_ml.ml_line_count) if (prefer_above ? (round == 2 && below < above)
: (round == 1 && below <= above))
{ {
botline_forw(&boff); // add a line below the cursor
used += boff.height; if (boff.lnum < curbuf->b_ml.ml_line_count)
{
botline_forw(&boff);
used += boff.height;
if (used > curwin->w_height)
{
done = TRUE;
break;
}
below += boff.height;
}
else
{
++below; // count a "~" line
if (atend)
++used;
}
}
if (prefer_above ? (round == 1 && below >= above)
: (round == 1 && below > above))
{
// add a line above the cursor
topline_back(&loff);
if (loff.height == MAXCOL)
used = MAXCOL;
else
used += loff.height;
if (used > curwin->w_height) if (used > curwin->w_height)
{
done = TRUE;
break; break;
below += boff.height; }
} above += loff.height;
else topline = loff.lnum;
{
++below; // count a "~" line
if (atend)
++used;
}
}
if (below > above) // add a line above the cursor
{
topline_back(&loff);
if (loff.height == MAXCOL)
used = MAXCOL;
else
used += loff.height;
if (used > curwin->w_height)
break;
above += loff.height;
topline = loff.lnum;
#ifdef FEAT_DIFF #ifdef FEAT_DIFF
topfill = loff.fill; topfill = loff.fill;
#endif #endif
}
} }
if (done)
break;
} }
#ifdef FEAT_FOLDING #ifdef FEAT_FOLDING
if (!hasFolding(topline, &curwin->w_topline, NULL)) if (!hasFolding(topline, &curwin->w_topline, NULL))
#endif #endif

View File

@@ -2712,7 +2712,7 @@ nv_zet(cmdarg_T *cap)
case '.': beginline(BL_WHITE | BL_FIX); case '.': beginline(BL_WHITE | BL_FIX);
// FALLTHROUGH // FALLTHROUGH
case 'z': scroll_cursor_halfway(TRUE); case 'z': scroll_cursor_halfway(TRUE, FALSE);
redraw_later(UPD_VALID); redraw_later(UPD_VALID);
set_fraction(curwin); set_fraction(curwin);
break; break;

View File

@@ -43,7 +43,7 @@ void scrollup_clamp(void);
void scroll_cursor_top(int min_scroll, int always); void scroll_cursor_top(int min_scroll, int always);
void set_empty_rows(win_T *wp, int used); void set_empty_rows(win_T *wp, int used);
void scroll_cursor_bot(int min_scroll, int set_topbot); void scroll_cursor_bot(int min_scroll, int set_topbot);
void scroll_cursor_halfway(int atend); void scroll_cursor_halfway(int atend, int prefer_above);
void cursor_correct(void); void cursor_correct(void);
int onepage(int dir, long count); int onepage(int dir, long count);
void halfpage(int flag, linenr_T Prenum); void halfpage(int flag, linenr_T Prenum);

View File

@@ -2,10 +2,10 @@
|#|i|n|c|l|u|d|e| |"|X|h|e|a|d|e|r|.|h|"| @54 |#|i|n|c|l|u|d|e| |"|X|h|e|a|d|e|r|.|h|"| @54
|t|h|r|e@1| @69 |t|h|r|e@1| @69
|f|o|u|r| @3|╔+0&#afffff255| |X|t|a|g|f|i|l|e| |═@30|X| +0&#ffffff0@23 |f|o|u|r| @3|╔+0&#afffff255| |X|t|a|g|f|i|l|e| |═@30|X| +0&#ffffff0@23
|f|i|v|e| @3|║+0&#afffff255|2|7| @37| +0&#a8a8a8255|║+0&#afffff255| +0&#ffffff0@23 |f|i|v|e| @3|║+0&#afffff255|2|6| @37| +0&#a8a8a8255|║+0&#afffff255| +0&#ffffff0@23
|s|i|x| @4|║+0&#afffff255|t|h|i|s| |i|s| |a|n|o|t|h|e|r| |p|l|a|c|e| @18| +0&#a8a8a8255|║+0&#afffff255| +0&#ffffff0@23 |s|i|x| @4|║+0&#afffff255|2|7| @37| +0&#a8a8a8255|║+0&#afffff255| +0&#ffffff0@23
|s|e|v|e|n| @2|║+0&#afffff255|2|9| @37| +0&#0000001|║+0&#afffff255| +0&#ffffff0@23 |s|e|v|e|n| @2|║+0&#afffff255|t|h|i|s| |i|s| |a|n|o|t|h|e|r| |p|l|a|c|e| @18| +0&#0000001|║+0&#afffff255| +0&#ffffff0@23
|f|i|n|d| |t|h|e|║+0&#afffff255|3|0| @37| +0&#a8a8a8255|║+0&#afffff255| +0&#ffffff0@23 |f|i|n|d| |t|h|e|║+0&#afffff255|2|9| @37| +0&#a8a8a8255|║+0&#afffff255| +0&#ffffff0@23
|n|i|n|e| @3|╚+0&#afffff255|═@40|⇲| +0&#ffffff0@23 |n|i|n|e| @3|╚+0&#afffff255|═@40|⇲| +0&#ffffff0@23
|t|h|i|s| |i|s| >a|n|o|t|h|e|r| |w|o|r|d| @54 |t|h|i|s| |i|s| >a|n|o|t|h|e|r| |w|o|r|d| @54
|v|e|r|y| |l|o|n|g| |l|i|n|e| |w|h|e|r|e| |t|h|e| |w|o|r|d| |i|s| |a|l|s|o| |a|n|o|t|h|e|r| @29 |v|e|r|y| |l|o|n|g| |l|i|n|e| |w|h|e|r|e| |t|h|e| |w|o|r|d| |i|s| |a|l|s|o| |a|n|o|t|h|e|r| @29

View File

@@ -2,10 +2,10 @@
|#|i|n|c|l|u|d|e| |"|X|h|e|a|d|e|r|.|h|"| @54 |#|i|n|c|l|u|d|e| |"|X|h|e|a|d|e|r|.|h|"| @54
|t|h|r|e@1| @69 |t|h|r|e@1| @69
|f|o|u|r| @9|╔+0&#afffff255| |X|t|a|g|f|i|l|e| |═@30|X| +0&#ffffff0@17 |f|o|u|r| @9|╔+0&#afffff255| |X|t|a|g|f|i|l|e| |═@30|X| +0&#ffffff0@17
|f|i|v|e| @9|║+0&#afffff255|2|7| @37| +0&#a8a8a8255|║+0&#afffff255| +0&#ffffff0@17 |f|i|v|e| @9|║+0&#afffff255|2|6| @37| +0&#a8a8a8255|║+0&#afffff255| +0&#ffffff0@17
|s|i|x| @10|║+0&#afffff255|t|h|i|s| |i|s| |a|n|o|t|h|e|r| |p|l|a|c|e| @18| +0&#a8a8a8255|║+0&#afffff255| +0&#ffffff0@17 |s|i|x| @10|║+0&#afffff255|2|7| @37| +0&#a8a8a8255|║+0&#afffff255| +0&#ffffff0@17
|s|e|v|e|n| @8|║+0&#afffff255|2|9| @37| +0&#0000001|║+0&#afffff255| +0&#ffffff0@17 |s|e|v|e|n| @8|║+0&#afffff255|t|h|i|s| |i|s| |a|n|o|t|h|e|r| |p|l|a|c|e| @18| +0&#0000001|║+0&#afffff255| +0&#ffffff0@17
|f|i|n|d| |t|h|e|w|o|r|d| |s|║+0&#afffff255|3|0| @37| +0&#a8a8a8255|║+0&#afffff255| +0&#ffffff0@17 |f|i|n|d| |t|h|e|w|o|r|d| |s|║+0&#afffff255|2|9| @37| +0&#a8a8a8255|║+0&#afffff255| +0&#ffffff0@17
|n|i|n|e| @9|╚+0&#afffff255|═@40|⇲| +0&#ffffff0@17 |n|i|n|e| @9|╚+0&#afffff255|═@40|⇲| +0&#ffffff0@17
|t|h|i|s| |i|s| >a|n|o|t|h|e|r| |w|o|r|d| @54 |t|h|i|s| |i|s| >a|n|o|t|h|e|r| |w|o|r|d| @54
|v|e|r|y| |l|o|n|g| |l|i|n|e| |w|h|e|r|e| |t|h|e| |w|o|r|d| |i|s| |a|l|s|o| |a|n|o|t|h|e|r| @29 |v|e|r|y| |l|o|n|g| |l|i|n|e| |w|h|e|r|e| |t|h|e| |w|o|r|d| |i|s| |a|l|s|o| |a|n|o|t|h|e|r| @29

View File

@@ -3,10 +3,10 @@
|t|h|r|e@1| @69 |t|h|r|e@1| @69
|f|o|u|r| @70 |f|o|u|r| @70
|f|i|v|e| @27|╔+0&#afffff255| |X|t|a|g|f|i|l|e| |═@30|X |f|i|v|e| @27|╔+0&#afffff255| |X|t|a|g|f|i|l|e| |═@30|X
|s+0&#ffffff0|i|x| @28|║+0&#afffff255|2|7| @37| +0&#a8a8a8255|║+0&#afffff255 |s+0&#ffffff0|i|x| @28|║+0&#afffff255|2|6| @37| +0&#a8a8a8255|║+0&#afffff255
|s+0&#ffffff0|e|v|e|n| @26|║+0&#afffff255|t|h|i|s| |i|s| |a|n|o|t|h|e|r| |p|l|a|c|e| @18| +0&#a8a8a8255|║+0&#afffff255 |s+0&#ffffff0|e|v|e|n| @26|║+0&#afffff255|2|7| @37| +0&#a8a8a8255|║+0&#afffff255
|f+0&#ffffff0|i|n|d| |t|h|e|w|o|r|d| |s|o|m|e|w|h|e|r|e| @9|║+0&#afffff255|2|9| @37| +0&#0000001|║+0&#afffff255 |f+0&#ffffff0|i|n|d| |t|h|e|w|o|r|d| |s|o|m|e|w|h|e|r|e| @9|║+0&#afffff255|t|h|i|s| |i|s| |a|n|o|t|h|e|r| |p|l|a|c|e| @18| +0&#0000001|║+0&#afffff255
|n+0&#ffffff0|i|n|e| @27|║+0&#afffff255|3|0| @37| +0&#a8a8a8255|║+0&#afffff255 |n+0&#ffffff0|i|n|e| @27|║+0&#afffff255|2|9| @37| +0&#a8a8a8255|║+0&#afffff255
|t+0&#ffffff0|h|i|s| |i|s| |a|n|o|t|h|e|r| |w|o|r|d| @11|╚+0&#afffff255|═@40|⇲ |t+0&#ffffff0|h|i|s| |i|s| |a|n|o|t|h|e|r| |w|o|r|d| @11|╚+0&#afffff255|═@40|⇲
|v+0&#ffffff0|e|r|y| |l|o|n|g| |l|i|n|e| |w|h|e|r|e| |t|h|e| |w|o|r|d| |i|s| |a|l|s|o| >a|n|o|t|h|e|r| @29 |v+0&#ffffff0|e|r|y| |l|o|n|g| |l|i|n|e| |w|h|e|r|e| |t|h|e| |w|o|r|d| |i|s| |a|l|s|o| >a|n|o|t|h|e|r| @29
|~+0#4040ff13&| @73 |~+0#4040ff13&| @73

View File

@@ -3,10 +3,10 @@
|t|h|r|e@1| @69 |t|h|r|e@1| @69
|f|o|u|r| @70 |f|o|u|r| @70
|f|i|v|e| @27|╔+0&#afffff255| |t|e|s|t|d|i|r|/|X|t|a|g|f|i|l|e| |═@22|X |f|i|v|e| @27|╔+0&#afffff255| |t|e|s|t|d|i|r|/|X|t|a|g|f|i|l|e| |═@22|X
|s+0&#ffffff0|i|x| @28|║+0&#afffff255|2|7| @37| +0&#a8a8a8255|║+0&#afffff255 |s+0&#ffffff0|i|x| @28|║+0&#afffff255|2|6| @37| +0&#a8a8a8255|║+0&#afffff255
|s+0&#ffffff0|e|v|e|n| @26|║+0&#afffff255|t|h|i|s| |i|s| |a|n|o|t|h|e|r| |p|l|a|c|e| @18| +0&#a8a8a8255|║+0&#afffff255 |s+0&#ffffff0|e|v|e|n| @26|║+0&#afffff255|2|7| @37| +0&#a8a8a8255|║+0&#afffff255
|f+0&#ffffff0|i|n|d| |t|h|e|w|o|r|d| |s|o|m|e|w|h|e|r|e| @9|║+0&#afffff255|2|9| @37| +0&#0000001|║+0&#afffff255 |f+0&#ffffff0|i|n|d| |t|h|e|w|o|r|d| |s|o|m|e|w|h|e|r|e| @9|║+0&#afffff255|t|h|i|s| |i|s| |a|n|o|t|h|e|r| |p|l|a|c|e| @18| +0&#0000001|║+0&#afffff255
|n+0&#ffffff0|i|n|e| @27|║+0&#afffff255|3|0| @37| +0&#a8a8a8255|║+0&#afffff255 |n+0&#ffffff0|i|n|e| @27|║+0&#afffff255|2|9| @37| +0&#a8a8a8255|║+0&#afffff255
|t+0&#ffffff0|h|i|s| |i|s| |a|n|o|t|h|e|r| |w|o|r|d| @11|╚+0&#afffff255|═@40|⇲ |t+0&#ffffff0|h|i|s| |i|s| |a|n|o|t|h|e|r| |w|o|r|d| @11|╚+0&#afffff255|═@40|⇲
|v+0&#ffffff0|e|r|y| |l|o|n|g| |l|i|n|e| |w|h|e|r|e| |t|h|e| |w|o|r|d| |i|s| |a|l|s|o| >a|n|o|t|h|e|r| @29 |v+0&#ffffff0|e|r|y| |l|o|n|g| |l|i|n|e| |w|h|e|r|e| |t|h|e| |w|o|r|d| |i|s| |a|l|s|o| >a|n|o|t|h|e|r| @29
|~+0#4040ff13&| @73 |~+0#4040ff13&| @73

View File

@@ -38,6 +38,23 @@ func Test_reset_scroll()
quit! quit!
endfunc endfunc
func Test_scolloff_even_line_count()
new
resize 6
setlocal scrolloff=3
call setline(1, range(20))
normal 2j
call assert_equal(1, getwininfo(win_getid())[0].topline)
normal j
call assert_equal(1, getwininfo(win_getid())[0].topline)
normal j
call assert_equal(2, getwininfo(win_getid())[0].topline)
normal j
call assert_equal(3, getwininfo(win_getid())[0].topline)
bwipe!
endfunc
func Test_CtrlE_CtrlY_stop_at_end() func Test_CtrlE_CtrlY_stop_at_end()
enew enew
call setline(1, ['one', 'two']) call setline(1, ['one', 'two'])

View File

@@ -218,8 +218,8 @@ end of window 2
\ '7 line 02 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 02', \ '7 line 02 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 02',
\ '56789ABCDEFGHIJKLMNOPQRSTUVWXYZ 02', \ '56789ABCDEFGHIJKLMNOPQRSTUVWXYZ 02',
\ 'UTSRQPONMLKJIHGREDCBA9876543210 02', \ 'UTSRQPONMLKJIHGREDCBA9876543210 02',
\ '. line 11 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 11', \ '. line 10 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 10',
\ '. line 11 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 11', \ '. line 10 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 10',
\ ''], getline(1, '$')) \ ''], getline(1, '$'))
enew! enew!

View File

@@ -695,6 +695,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1309,
/**/ /**/
1308, 1308,
/**/ /**/