aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/move.c9
-rw-r--r--test/functional/legacy/scroll_opt_spec.lua67
-rw-r--r--test/old/testdir/test_scroll_opt.vim33
3 files changed, 101 insertions, 8 deletions
diff --git a/src/nvim/move.c b/src/nvim/move.c
index ead2b3b0d3..9e8abbcd96 100644
--- a/src/nvim/move.c
+++ b/src/nvim/move.c
@@ -248,7 +248,6 @@ void update_topline(win_T *wp)
}
linenr_T old_topline = wp->w_topline;
- colnr_T old_skipcol = wp->w_skipcol;
int old_topfill = wp->w_topfill;
// If the buffer is empty, always set topline to 1.
@@ -413,9 +412,11 @@ void update_topline(win_T *wp)
dollar_vcol = -1;
redraw_later(wp, UPD_VALID);
- // Only reset w_skipcol if it was not just set to make cursor visible.
- if (wp->w_skipcol == old_skipcol) {
+ // When 'smoothscroll' is not set, should reset w_skipcol.
+ if (!wp->w_p_sms) {
reset_skipcol(wp);
+ } else if (wp->w_skipcol != 0) {
+ redraw_later(wp, UPD_SOME_VALID);
}
// May need to set w_skipcol when cursor in w_topline.
@@ -660,7 +661,7 @@ static void curs_rows(win_T *wp)
i--; // hold at inserted lines
}
}
- if (valid && (lnum != wp->w_topline || !win_may_fill(wp))) {
+ if (valid && (lnum != wp->w_topline || (wp->w_skipcol == 0 && !win_may_fill(wp)))) {
lnum = wp->w_lines[i].wl_lastlnum + 1;
// Cursor inside folded lines, don't count this row
if (lnum > wp->w_cursor.lnum) {
diff --git a/test/functional/legacy/scroll_opt_spec.lua b/test/functional/legacy/scroll_opt_spec.lua
index 838ada4006..cd4c2fda8b 100644
--- a/test/functional/legacy/scroll_opt_spec.lua
+++ b/test/functional/legacy/scroll_opt_spec.lua
@@ -428,7 +428,9 @@ describe('smoothscroll', function()
screen:expect_unchanged()
feed('G')
screen:expect_unchanged()
- -- moving cursor up right after the >>> marker - no need to show whole line
+ feed('4<C-Y>G')
+ screen:expect_unchanged()
+ -- moving cursor up right after the <<< marker - no need to show whole line
feed('2gj3l2k')
screen:expect([[
<<<^h some text with some text |
@@ -440,7 +442,7 @@ describe('smoothscroll', function()
with some text with some text |
|
]])
- -- moving cursor up where the >>> marker is - whole top line shows
+ -- moving cursor up where the <<< marker is - whole top line shows
feed('2j02k')
screen:expect([[
^Line with some text with some text with |
@@ -776,6 +778,67 @@ describe('smoothscroll', function()
]])
end)
+ -- oldtest: Test_smoothscroll_incsearch()
+ it("does not reset skipcol when doing incremental search on the same word", function()
+ screen:try_resize(40, 8)
+ screen:set_default_attr_ids({
+ [1] = {foreground = Screen.colors.Brown},
+ [2] = {foreground = Screen.colors.Blue1, bold = true},
+ [3] = {background = Screen.colors.Yellow1},
+ [4] = {reverse = true},
+ })
+ exec([[
+ set smoothscroll number scrolloff=0 incsearch
+ call setline(1, repeat([''], 20))
+ call setline(11, repeat('a', 100))
+ call setline(14, 'bbbb')
+ ]])
+ feed('/b')
+ screen:expect([[
+ {2:<<<}{1: }aaaaaaaaaaaaaaaaaaaaaaaaaaaa |
+ {1: 12 } |
+ {1: 13 } |
+ {1: 14 }{4:b}{3:bbb} |
+ {1: 15 } |
+ {1: 16 } |
+ {1: 17 } |
+ /b^ |
+ ]])
+ feed('b')
+ screen:expect([[
+ {2:<<<}{1: }aaaaaaaaaaaaaaaaaaaaaaaaaaaa |
+ {1: 12 } |
+ {1: 13 } |
+ {1: 14 }{4:bb}{3:bb} |
+ {1: 15 } |
+ {1: 16 } |
+ {1: 17 } |
+ /bb^ |
+ ]])
+ feed('b')
+ screen:expect([[
+ {2:<<<}{1: }aaaaaaaaaaaaaaaaaaaaaaaaaaaa |
+ {1: 12 } |
+ {1: 13 } |
+ {1: 14 }{4:bbb}b |
+ {1: 15 } |
+ {1: 16 } |
+ {1: 17 } |
+ /bbb^ |
+ ]])
+ feed('b')
+ screen:expect([[
+ {2:<<<}{1: }aaaaaaaaaaaaaaaaaaaaaaaaaaaa |
+ {1: 12 } |
+ {1: 13 } |
+ {1: 14 }{4:bbbb} |
+ {1: 15 } |
+ {1: 16 } |
+ {1: 17 } |
+ /bbbb^ |
+ ]])
+ end)
+
it("works with virt_lines above and below", function()
screen:try_resize(55, 7)
exec([=[
diff --git a/test/old/testdir/test_scroll_opt.vim b/test/old/testdir/test_scroll_opt.vim
index 74c2de81aa..5ac80764b5 100644
--- a/test/old/testdir/test_scroll_opt.vim
+++ b/test/old/testdir/test_scroll_opt.vim
@@ -257,11 +257,14 @@ func Test_smoothscroll_wrap_scrolloff_zero()
call term_sendkeys(buf, "G")
call VerifyScreenDump(buf, 'Test_smooth_wrap_4', {})
- " moving cursor up right after the >>> marker - no need to show whole line
+ call term_sendkeys(buf, "4\<C-Y>G")
+ call VerifyScreenDump(buf, 'Test_smooth_wrap_4', {})
+
+ " moving cursor up right after the <<< marker - no need to show whole line
call term_sendkeys(buf, "2gj3l2k")
call VerifyScreenDump(buf, 'Test_smooth_wrap_5', {})
- " moving cursor up where the >>> marker is - whole top line shows
+ " moving cursor up where the <<< marker is - whole top line shows
call term_sendkeys(buf, "2j02k")
call VerifyScreenDump(buf, 'Test_smooth_wrap_6', {})
@@ -705,4 +708,30 @@ func Test_smoothscroll_eob()
call StopVimInTerminal(buf)
endfunc
+" skipcol should not reset when doing incremental search on the same word
+func Test_smoothscroll_incsearch()
+ CheckScreendump
+
+ let lines =<< trim END
+ set smoothscroll number scrolloff=0 incsearch
+ call setline(1, repeat([''], 20))
+ call setline(11, repeat('a', 100))
+ call setline(14, 'bbbb')
+ END
+ call writefile(lines, 'XSmoothIncsearch', 'D')
+ let buf = RunVimInTerminal('-S XSmoothIncsearch', #{rows: 8, cols:40})
+
+ call term_sendkeys(buf, "/b")
+ call VerifyScreenDump(buf, 'Test_smooth_incsearch_1', {})
+ call term_sendkeys(buf, "b")
+ call VerifyScreenDump(buf, 'Test_smooth_incsearch_2', {})
+ call term_sendkeys(buf, "b")
+ call VerifyScreenDump(buf, 'Test_smooth_incsearch_3', {})
+ call term_sendkeys(buf, "b")
+ call VerifyScreenDump(buf, 'Test_smooth_incsearch_4', {})
+ call term_sendkeys(buf, "\<CR>")
+
+ call StopVimInTerminal(buf)
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab