commit 4e4383ffa2b9ec94e703ecbd6178737fc24f6866
parent 9b9ccac62563326c1ad59a403aa89851a379ddbb
Author: Luuk van Baal <luukvbaal@gmail.com>
Date: Fri, 28 Apr 2023 16:22:42 +0200
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 <Bram@vim.org>
Diffstat:
4 files changed, 60 insertions(+), 2 deletions(-)
diff --git 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
@@ -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
@@ -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('llllllllll<C-W>o')
+ 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
@@ -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 \<C-V>\<C-W>\<C-V>\<C-N>\<CR>")
+ call VerifyScreenDump(buf, 'Test_smoothscroll_zero_2', {})
+
+ call StopVimInTerminal(buf)
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab