From 4e4383ffa2b9ec94e703ecbd6178737fc24f6866 Mon Sep 17 00:00:00 2001 From: Luuk van Baal Date: Fri, 28 Apr 2023 16:22:42 +0200 Subject: [PATCH] vim-patch:9.0.1247: divide by zero with 'smoothscroll' set and a narrow window Problem: Divide by zero with 'smoothscroll' set and a narrow window. Solution: Bail out when the window is too narrow. https://github.com/vim/vim/commit/870219c58c0804bdc55419b2e455c06ac715a835 Co-authored-by: Bram Moolenaar --- runtime/doc/options.txt | 6 +++-- src/nvim/move.c | 3 +++ test/functional/legacy/scroll_opt_spec.lua | 26 +++++++++++++++++++++ test/old/testdir/test_scroll_opt.vim | 27 ++++++++++++++++++++++ 4 files changed, 60 insertions(+), 2 deletions(-) diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 7cb88441f1..ab86e56a62 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -5657,8 +5657,10 @@ A jump table for the options with a short description can be found at |Q_op|. local to window Scrolling works with screen lines. When 'wrap' is set and the first line in the window wraps part of it may not be visible, as if it is - above the window. - NOTE: only partly implemented, works with CTRL-E and CTRL-Y. + above the window. "<<<" is displayed at the start of the first line, + highlighted with |hl-NonText|. + NOTE: only partly implemented, currently works with CTRL-E, CTRL-Y + and scrolling with the mouse. *'softtabstop'* *'sts'* 'softtabstop' 'sts' number (default 0) diff --git a/src/nvim/move.c b/src/nvim/move.c index 7cc65c83ce..e635b381d3 100644 --- a/src/nvim/move.c +++ b/src/nvim/move.c @@ -1475,6 +1475,9 @@ void adjust_skipcol(void) } int width1 = curwin->w_width - curwin_col_off(); + if (width1 <= 0) { + return; // no text will be displayed + } int width2 = width1 + curwin_col_off2(); long so = get_scrolloff_value(curwin); long scrolloff_cols = so == 0 ? 0 : width1 + (so - 1) * width2; diff --git a/test/functional/legacy/scroll_opt_spec.lua b/test/functional/legacy/scroll_opt_spec.lua index e58b95ecc1..f9dc9e81ca 100644 --- a/test/functional/legacy/scroll_opt_spec.lua +++ b/test/functional/legacy/scroll_opt_spec.lua @@ -620,4 +620,30 @@ describe('smoothscroll', function() feed('0') screen:expect(s1) end) + + -- oldtest: Test_smoothscroll_zero_width() + it("does not divide by zero with a narrow window", function() + screen:try_resize(12, 2) + screen:set_default_attr_ids({ + [1] = {foreground = Screen.colors.Brown}, + [2] = {foreground = Screen.colors.Blue1, bold = true}, + }) + exec([[ + call setline(1, ['a'->repeat(100)]) + set wrap smoothscroll number laststatus=0 + wincmd v + wincmd v + wincmd v + wincmd v + ]]) + screen:expect([[ + {1: 1^ }│{1: }│{1: }│{1: }│{1: }| + | + ]]) + feed('llllllllllo') + screen:expect([[ + {2:<<<}{1: }aa^aaaaaa| + | + ]]) + end) end) diff --git a/test/old/testdir/test_scroll_opt.vim b/test/old/testdir/test_scroll_opt.vim index 3c95c36b4f..4ed54591af 100644 --- a/test/old/testdir/test_scroll_opt.vim +++ b/test/old/testdir/test_scroll_opt.vim @@ -577,5 +577,32 @@ func Test_smoothscroll_mouse_pos() "let &ttymouse = save_ttymouse endfunc +" this was dividing by zero +func Test_smoothscrol_zero_width() + CheckScreendump + + let lines =<< trim END + winsize 0 0 + vsplit + vsplit + vsplit + vsplit + vsplit + sil norm H + set wrap + set smoothscroll + set number + END + call writefile(lines, 'XSmoothScrollZero', 'D') + let buf = RunVimInTerminal('-u NONE -i NONE -n -m -X -Z -e -s -S XSmoothScrollZero', #{rows: 6, cols: 60, wait_for_ruler: 0}) + call TermWait(buf, 3000) + call VerifyScreenDump(buf, 'Test_smoothscroll_zero_1', {}) + + call term_sendkeys(buf, ":sil norm \\\\\") + call VerifyScreenDump(buf, 'Test_smoothscroll_zero_2', {}) + + call StopVimInTerminal(buf) +endfunc + " vim: shiftwidth=2 sts=2 expandtab