forked from aniani/vim
patch 9.1.0414: Unable to leave long line with 'smoothscroll' and 'scrolloff'
Problem: Unable to leave long line with 'smoothscroll' and 'scrolloff'. Corrupted screen near the end of a long line with 'scrolloff'. (Ernie Rael, after 9.1.0280) Solution: Only correct cursor in case scroll_cursor_bot() was not itself called to make the cursor visible. Avoid adjusting for 'scrolloff' beyond the text line height (Luuk van Baal) fixes: #14726 closes: #14783 Signed-off-by: Luuk van Baal <luukvbaal@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
f5c8f520ba
commit
b32055e504
23
src/move.c
23
src/move.c
@@ -2027,6 +2027,8 @@ adjust_skipcol(void)
|
|||||||
long so = get_scrolloff_value();
|
long so = get_scrolloff_value();
|
||||||
int scrolloff_cols = so == 0 ? 0 : width1 + (so - 1) * width2;
|
int scrolloff_cols = so == 0 ? 0 : width1 + (so - 1) * width2;
|
||||||
int scrolled = FALSE;
|
int scrolled = FALSE;
|
||||||
|
int row = 0;
|
||||||
|
int overlap, col;
|
||||||
|
|
||||||
validate_cheight();
|
validate_cheight();
|
||||||
if (curwin->w_cline_height == curwin->w_height
|
if (curwin->w_cline_height == curwin->w_height
|
||||||
@@ -2041,7 +2043,7 @@ adjust_skipcol(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
validate_virtcol();
|
validate_virtcol();
|
||||||
int overlap = sms_marker_overlap(curwin, -1);
|
overlap = sms_marker_overlap(curwin, -1);
|
||||||
while (curwin->w_skipcol > 0
|
while (curwin->w_skipcol > 0
|
||||||
&& curwin->w_virtcol < curwin->w_skipcol + overlap + scrolloff_cols)
|
&& curwin->w_virtcol < curwin->w_skipcol + overlap + scrolloff_cols)
|
||||||
{
|
{
|
||||||
@@ -2059,8 +2061,19 @@ adjust_skipcol(void)
|
|||||||
return; // don't scroll in the other direction now
|
return; // don't scroll in the other direction now
|
||||||
}
|
}
|
||||||
|
|
||||||
int col = curwin->w_virtcol - curwin->w_skipcol + scrolloff_cols;
|
col = curwin->w_virtcol + scrolloff_cols;
|
||||||
int row = 0;
|
|
||||||
|
// Avoid adjusting for 'scrolloff' beyond the text line height.
|
||||||
|
if (scrolloff_cols > 0)
|
||||||
|
{
|
||||||
|
int size = win_linetabsize(curwin, curwin->w_topline,
|
||||||
|
ml_get(curwin->w_topline), (colnr_T)MAXCOL);
|
||||||
|
size = width1 + width2 * ((size - width1 + width2 - 1) / width2);
|
||||||
|
while (col > size)
|
||||||
|
col -= width2;
|
||||||
|
}
|
||||||
|
col -= curwin->w_skipcol;
|
||||||
|
|
||||||
if (col >= width1)
|
if (col >= width1)
|
||||||
{
|
{
|
||||||
col -= width1;
|
col -= width1;
|
||||||
@@ -2785,7 +2798,9 @@ scroll_cursor_bot(int min_scroll, int set_topbot)
|
|||||||
}
|
}
|
||||||
curwin->w_valid |= VALID_TOPLINE;
|
curwin->w_valid |= VALID_TOPLINE;
|
||||||
|
|
||||||
cursor_correct_sms();
|
// Make sure cursor is still visible after adjusting skipcol for "zb".
|
||||||
|
if (set_topbot)
|
||||||
|
cursor_correct_sms();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -3,4 +3,4 @@
|
|||||||
|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o
|
|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o
|
||||||
|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e
|
|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e
|
||||||
|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w
|
|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w
|
||||||
|:|s|e|t| |s|c|r|o|l@1|o| @9|3|,|9|0| @9|6@1|%|
|
| @21|3|,|9|0| @9|6@1|%|
|
||||||
|
@@ -3,4 +3,4 @@
|
|||||||
|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o
|
|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o
|
||||||
|f| |t|e|x|t| |w|i>t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e
|
|f| |t|e|x|t| |w|i>t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e
|
||||||
|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w
|
|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w
|
||||||
|:|s|e|t| |s|c|r|o|l@1|o| @9|3|,|1|7|0| @8|6@1|%|
|
| @21|3|,|1|7|0| @8|6@1|%|
|
||||||
|
8
src/testdir/dumps/Test_smooth_long_scrolloff_1.dump
Normal file
8
src/testdir/dumps/Test_smooth_long_scrolloff_1.dump
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
| +0&#ffffff0@39
|
||||||
|
@40
|
||||||
|
@40
|
||||||
|
> @39
|
||||||
|
@40
|
||||||
|
@40
|
||||||
|
@40
|
||||||
|
@40
|
8
src/testdir/dumps/Test_smooth_long_scrolloff_2.dump
Normal file
8
src/testdir/dumps/Test_smooth_long_scrolloff_2.dump
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
|<+0#4040ff13#ffffff0@2| +0#0000000&|l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
>t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
| @39
|
8
src/testdir/dumps/Test_smooth_long_scrolloff_3.dump
Normal file
8
src/testdir/dumps/Test_smooth_long_scrolloff_3.dump
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
|<+0#4040ff13#ffffff0@2| +0#0000000&|l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
>t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
| @39
|
8
src/testdir/dumps/Test_smooth_long_scrolloff_4.dump
Normal file
8
src/testdir/dumps/Test_smooth_long_scrolloff_4.dump
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
|<+0#4040ff13#ffffff0@2| +0#0000000&|l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
>t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
| @39
|
8
src/testdir/dumps/Test_smooth_long_scrolloff_5.dump
Normal file
8
src/testdir/dumps/Test_smooth_long_scrolloff_5.dump
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
|<+0#4040ff13#ffffff0@2| +0#0000000&|l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
>t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
| @39
|
8
src/testdir/dumps/Test_smooth_long_scrolloff_6.dump
Normal file
8
src/testdir/dumps/Test_smooth_long_scrolloff_6.dump
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
|<+0#4040ff13#ffffff0@2| +0#0000000&|l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
|
||||||
|
>t|h|r|e@1| @34
|
||||||
|
|f|o|u|r| @35
|
||||||
|
@40
|
8
src/testdir/dumps/Test_smooth_long_scrolloff_7.dump
Normal file
8
src/testdir/dumps/Test_smooth_long_scrolloff_7.dump
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
| +0&#ffffff0@39
|
||||||
|
@40
|
||||||
|
@40
|
||||||
|
@40
|
||||||
|
@40
|
||||||
|
@40
|
||||||
|
> @39
|
||||||
|
@40
|
@@ -1153,4 +1153,39 @@ func Test_smoothscroll_long_line_zb()
|
|||||||
bwipe!
|
bwipe!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_smooth_long_scrolloff()
|
||||||
|
CheckScreendump
|
||||||
|
|
||||||
|
let lines =<< trim END
|
||||||
|
set smoothscroll scrolloff=3
|
||||||
|
call setline(1, ['one', 'two long'->repeat(100), 'three', 'four', 'five', 'six'])
|
||||||
|
END
|
||||||
|
call writefile(lines, 'XSmoothLongScrolloff', 'D')
|
||||||
|
let buf = RunVimInTerminal('-u NONE -S XSmoothLongScrolloff', #{rows: 8, cols: 40})
|
||||||
|
"FIXME: empty screen due to reset_skipcol()/curs_columns() shenanigans
|
||||||
|
call term_sendkeys(buf, ":norm j601|\<CR>")
|
||||||
|
call VerifyScreenDump(buf, 'Test_smooth_long_scrolloff_1', {})
|
||||||
|
|
||||||
|
call term_sendkeys(buf, "gj")
|
||||||
|
call VerifyScreenDump(buf, 'Test_smooth_long_scrolloff_2', {})
|
||||||
|
|
||||||
|
call term_sendkeys(buf, "gj")
|
||||||
|
call VerifyScreenDump(buf, 'Test_smooth_long_scrolloff_3', {})
|
||||||
|
|
||||||
|
call term_sendkeys(buf, "gj")
|
||||||
|
call VerifyScreenDump(buf, 'Test_smooth_long_scrolloff_4', {})
|
||||||
|
|
||||||
|
call term_sendkeys(buf, "gj")
|
||||||
|
call VerifyScreenDump(buf, 'Test_smooth_long_scrolloff_5', {})
|
||||||
|
|
||||||
|
call term_sendkeys(buf, "gj")
|
||||||
|
call VerifyScreenDump(buf, 'Test_smooth_long_scrolloff_6', {})
|
||||||
|
|
||||||
|
call term_sendkeys(buf, "gk")
|
||||||
|
"FIXME: empty screen due to reset_skipcol()/curs_columns() shenanigans
|
||||||
|
call VerifyScreenDump(buf, 'Test_smooth_long_scrolloff_7', {})
|
||||||
|
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
|
endfunc
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@@ -704,6 +704,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 */
|
||||||
|
/**/
|
||||||
|
414,
|
||||||
/**/
|
/**/
|
||||||
413,
|
413,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user