diff options
author | Luuk van Baal <luukvbaal@gmail.com> | 2023-04-28 16:22:42 +0200 |
---|---|---|
committer | Luuk van Baal <luukvbaal@gmail.com> | 2023-05-02 13:11:47 +0200 |
commit | 4e4383ffa2b9ec94e703ecbd6178737fc24f6866 (patch) | |
tree | 43e43a2879420cea7099e3756c3b097723358efd | |
parent | 9b9ccac62563326c1ad59a403aa89851a379ddbb (diff) | |
download | rneovim-4e4383ffa2b9ec94e703ecbd6178737fc24f6866.tar.gz rneovim-4e4383ffa2b9ec94e703ecbd6178737fc24f6866.tar.bz2 rneovim-4e4383ffa2b9ec94e703ecbd6178737fc24f6866.zip |
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>
-rw-r--r-- | runtime/doc/options.txt | 6 | ||||
-rw-r--r-- | src/nvim/move.c | 3 | ||||
-rw-r--r-- | test/functional/legacy/scroll_opt_spec.lua | 26 | ||||
-rw-r--r-- | 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('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 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 \<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 |