aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2020-10-07 19:52:40 -0400
committerGitHub <noreply@github.com>2020-10-07 19:52:40 -0400
commit3ea5df0f045b416c827e8fa841d01333fa0146e6 (patch)
tree4d6ad982e8715fc5ed1d3bdb7e98f123d5f433e1 /src
parent8ba5f4d19c6a2fa0de07a82867c52e68f5a757b7 (diff)
parenta893593a9f54a0fbe84b467d43f11a841ecae2ee (diff)
downloadrneovim-3ea5df0f045b416c827e8fa841d01333fa0146e6.tar.gz
rneovim-3ea5df0f045b416c827e8fa841d01333fa0146e6.tar.bz2
rneovim-3ea5df0f045b416c827e8fa841d01333fa0146e6.zip
Merge pull request #13029 from aufarg/vim-8.2.1345
[RDY] vim-patch:8.2.{1345,1488}
Diffstat (limited to 'src')
-rw-r--r--src/nvim/screen.c11
-rw-r--r--src/nvim/testdir/test_display.vim37
2 files changed, 43 insertions, 5 deletions
diff --git a/src/nvim/screen.c b/src/nvim/screen.c
index 3503348049..7c42f29a90 100644
--- a/src/nvim/screen.c
+++ b/src/nvim/screen.c
@@ -899,11 +899,12 @@ static void win_update(win_T *wp)
|| type == INVERTED || type == INVERTED_ALL)
&& !wp->w_botfill && !wp->w_old_botfill
) {
- if (mod_top != 0 && wp->w_topline == mod_top) {
- /*
- * w_topline is the first changed line, the scrolling will be done
- * further down.
- */
+ if (mod_top != 0
+ && wp->w_topline == mod_top
+ && (!wp->w_lines[0].wl_valid
+ || wp->w_topline <= wp->w_lines[0].wl_lnum)) {
+ // w_topline is the first changed line and window is not scrolled,
+ // the scrolling from changed lines will be done further down.
} else if (wp->w_lines[0].wl_valid
&& (wp->w_topline < wp->w_lines[0].wl_lnum
|| (wp->w_topline == wp->w_lines[0].wl_lnum
diff --git a/src/nvim/testdir/test_display.vim b/src/nvim/testdir/test_display.vim
index 429253a863..e853b046dc 100644
--- a/src/nvim/testdir/test_display.vim
+++ b/src/nvim/testdir/test_display.vim
@@ -184,3 +184,40 @@ func Test_scroll_CursorLineNr_update()
call StopVimInTerminal(buf)
call delete(filename)
endfunc
+
+" Test for scrolling that modifies buffer during visual block
+func Test_visual_block_scroll()
+ " See test/functional/legacy/visual_mode_spec.lua
+ CheckScreendump
+
+ let lines =<< trim END
+ source $VIMRUNTIME/plugin/matchparen.vim
+ set scrolloff=1
+ call setline(1, ['a', 'b', 'c', 'd', 'e', '', '{', '}', '{', 'f', 'g', '}'])
+ call cursor(5, 1)
+ END
+
+ let filename = 'Xvisualblockmodifiedscroll'
+ call writefile(lines, filename)
+
+ let buf = RunVimInTerminal('-S '.filename, #{rows: 7})
+ call term_sendkeys(buf, "V\<C-D>\<C-D>")
+
+ call VerifyScreenDump(buf, 'Test_display_visual_block_scroll', {})
+
+ call StopVimInTerminal(buf)
+ call delete(filename)
+endfunc
+
+func Test_display_scroll_at_topline()
+ " See test/functional/legacy/display_spec.lua
+ CheckScreendump
+
+ let buf = RunVimInTerminal('', #{cols: 20})
+ call term_sendkeys(buf, ":call setline(1, repeat('a', 21))\<CR>")
+ call term_wait(buf)
+ call term_sendkeys(buf, "O\<Esc>")
+ call VerifyScreenDump(buf, 'Test_display_scroll_at_topline', #{rows: 4})
+
+ call StopVimInTerminal(buf)
+endfunc