aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorluukvbaal <luukvbaal@gmail.com>2024-09-01 14:19:19 +0200
committerGitHub <noreply@github.com>2024-09-01 20:19:19 +0800
commit97f8d1de1cfaebd67bc994401da38b003b64b6df (patch)
tree1e48ff34190d16889809a243669b4b004244513c
parent9b983e5f6cbfeaaf491ad57912518042be650b6d (diff)
downloadrneovim-97f8d1de1cfaebd67bc994401da38b003b64b6df.tar.gz
rneovim-97f8d1de1cfaebd67bc994401da38b003b64b6df.tar.bz2
rneovim-97f8d1de1cfaebd67bc994401da38b003b64b6df.zip
vim-patch:9.1.0708: Recursive window update does not account for reset skipcol (#30217)
Problem: Window is updated with potentially invalid skipcol in recursive window update path. I.e. cursor outside of visible range in large line that does not fit. Solution: Make sure it is valid (Luuk van Baal). https://github.com/vim/vim/commit/3d5065fc7553c8de3d0555c3085165bdd724663b
-rw-r--r--src/nvim/drawscreen.c2
-rw-r--r--test/functional/legacy/scroll_opt_spec.lua18
-rw-r--r--test/old/testdir/test_scroll_opt.vim2
3 files changed, 10 insertions, 12 deletions
diff --git a/src/nvim/drawscreen.c b/src/nvim/drawscreen.c
index 425651b60e..025d8fe721 100644
--- a/src/nvim/drawscreen.c
+++ b/src/nvim/drawscreen.c
@@ -2453,10 +2453,12 @@ redr_statuscol:
recursive = true;
curwin->w_valid &= ~VALID_TOPLINE;
update_topline(curwin); // may invalidate w_botline again
+ // New redraw either due to updated topline or reset skipcol.
if (must_redraw != 0) {
// Don't update for changes in buffer again.
int mod_set = curbuf->b_mod_set;
curbuf->b_mod_set = false;
+ curs_columns(curwin, true);
win_update(curwin);
must_redraw = 0;
curbuf->b_mod_set = mod_set;
diff --git a/test/functional/legacy/scroll_opt_spec.lua b/test/functional/legacy/scroll_opt_spec.lua
index 97578067d5..80b689df55 100644
--- a/test/functional/legacy/scroll_opt_spec.lua
+++ b/test/functional/legacy/scroll_opt_spec.lua
@@ -1204,16 +1204,15 @@ describe('smoothscroll', function()
set smoothscroll scrolloff=3
call setline(1, ['one', 'two long '->repeat(100), 'three', 'four', 'five', 'six'])
]])
- --FIXME: incorrect screen due to reset_skipcol()/curs_columns() shenanigans
feed(':norm j721|<CR>')
screen:expect([[
- two long two long two long two long two |
+ {1:<<<}two long two long two long two long t|
+ wo long two long two long two long two l|
+ ong two long two long two long two long |
+ ^two long two long two long two long two |
long two long two long two long two long|
two long two long two long two long two|
- ^ long two long two long two long two lon|
- g two long two long two long two long tw|
- o long two long two long two long two lo|
- ng two long two long two long two long t|
+ long two long two long two long two lon|
:norm j721| |
]])
feed('gj')
@@ -1272,15 +1271,14 @@ describe('smoothscroll', function()
:norm j721| |
]])
feed('gk')
- --FIXME: incorrect screen due to reset_skipcol()/curs_columns() shenanigans
screen:expect([[
+ {1:<<<}long two long two long two long two l|
+ ong two long two long two long two long |
two long two long two long two long two |
long two long two long two long two long|
two long two long two long two long two|
long two long two long two long two lon|
- g two long two long two long two long tw|
- o long two long two long two long two lo|
- ^ng two long two long two long two long t|
+ ^g two long two long |
:norm j721| |
]])
end)
diff --git a/test/old/testdir/test_scroll_opt.vim b/test/old/testdir/test_scroll_opt.vim
index 02e1cc71e4..5bf071903b 100644
--- a/test/old/testdir/test_scroll_opt.vim
+++ b/test/old/testdir/test_scroll_opt.vim
@@ -1165,7 +1165,6 @@ func Test_smooth_long_scrolloff()
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 j721|\<CR>")
call VerifyScreenDump(buf, 'Test_smooth_long_scrolloff_1', {})
@@ -1185,7 +1184,6 @@ func Test_smooth_long_scrolloff()
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)