patch 9.1.1385: inefficient loop for 'nosmoothscroll' scrolling Commit: https://github.com/vim/vim/commit/acf0ebe8a8f4dd389a8fe8cea52ff43bc8bfe1be Author: Luuk van Baal <luukvb...@gmail.com> Date: Mon May 12 20:45:41 2025 +0200
patch 9.1.1385: inefficient loop for 'nosmoothscroll' scrolling Problem: Loop that ensures "w_skipcol" is zero with 'nosmoothscroll' for (half)-page scrolling is inefficient. Solution: Calculate the required "count" instead of looping until "w_skipcol" is zero (Luuk van Baal). fixes: #17301 closes: #17306 Signed-off-by: Luuk van Baal <luukvb...@gmail.com> Signed-off-by: Christian Brabandt <c...@256bit.org> diff --git a/src/move.c b/src/move.c index f4bce40d7..1c1eddeef 100644 --- a/src/move.c +++ b/src/move.c @@ -3212,12 +3212,15 @@ static int scroll_with_sms(int dir, long count, long *curscount) // extra for scrolling backward so that consuming skipcol is symmetric. if (labs(curwin->w_topline - prev_topline) > (dir == BACKWARD)) fixdir = dir * -1; - while (curwin->w_skipcol > 0 - && curwin->w_topline < curbuf->b_ml.ml_line_count) - { - scroll_redraw(fixdir == FORWARD, 1); - *curscount += (fixdir == dir ? 1 : -1); - } + + int width1 = curwin->w_width - curwin_col_off(); + int width2 = width1 + curwin_col_off2(); + count = 1 + (curwin->w_skipcol - width1) / width2; + if (fixdir == FORWARD) + count = 2 + (linetabsize_eol(curwin, curwin->w_topline) + - curwin->w_skipcol - width1) / width2; + scroll_redraw(fixdir == FORWARD, count); + *curscount += count * (fixdir == dir ? 1 : -1); } curwin->w_p_sms = prev_sms; diff --git a/src/testdir/test_normal.vim b/src/testdir/test_normal.vim index aa24bceda..7f4f90964 100644 --- a/src/testdir/test_normal.vim +++ b/src/testdir/test_normal.vim @@ -4345,4 +4345,13 @@ func Test_scroll_longline_scrolloff() bwipe! endfunc +" Benchmark test for Ctrl-F with 'nosmoothscroll' +func Test_scroll_longline_benchmark() + call setline(1, ['foo'->repeat(20000)] + ['']) + let start = reltime() + exe "normal! \<C-F>" + call assert_inrange(0, 0.1, reltimefloat(reltime(start))) + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab nofoldenable diff --git a/src/version.c b/src/version.c index 55860d2d6..a2cfb00f3 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1385, /**/ 1384, /**/ -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/vim_dev/E1uEYNe-006Vcs-QQ%40256bit.org.