Patch 9.0.1530
Problem: Cursor moves to wrong line when 'foldmethod' is "diff". (Rick
Howe)
Solution: Adjust logic for scrolling. (Luuk van Baal, closes #12364,
closes #12218)
Files: src/move.c, src/testdir/test_normal.vim,
src/testdir/dumps/Test_normal_j_below_botline.dump
*** ../vim-9.0.1529/src/move.c 2023-05-08 15:50:49.194261284 +0100
--- src/move.c 2023-05-09 15:52:40.846639135 +0100
***************
*** 1753,1774 ****
}
/*
- * Return TRUE if scrollup() will scroll by screen line rather than text line.
- */
- static int
- scrolling_screenlines(int byfold UNUSED)
- {
- return (curwin->w_p_wrap && curwin->w_p_sms)
- # ifdef FEAT_FOLDING
- || (byfold && hasAnyFolding(curwin))
- # endif
- # ifdef FEAT_DIFF
- || (curwin->w_p_diff && !curwin->w_p_wrap)
- # endif
- ;
- }
-
- /*
* Scroll the current window up by "line_count" logical lines. "CTRL-E"
*/
void
--- 1753,1758 ----
***************
*** 1778,1784 ****
{
int do_sms = curwin->w_p_wrap && curwin->w_p_sms;
! if (scrolling_screenlines(byfold))
{
int width1 = curwin->w_width - curwin_col_off();
int width2 = width1 + curwin_col_off2();
--- 1762,1775 ----
{
int do_sms = curwin->w_p_wrap && curwin->w_p_sms;
! if (do_sms
! # ifdef FEAT_FOLDING
! || (byfold && hasAnyFolding(curwin))
! # endif
! # ifdef FEAT_DIFF
! || (curwin->w_p_diff && !curwin->w_p_wrap)
! # endif
! )
{
int width1 = curwin->w_width - curwin_col_off();
int width2 = width1 + curwin_col_off2();
***************
*** 2466,2472 ****
{
int used;
int scrolled = 0;
- int min_scrolled = 1;
int extra = 0;
int i;
linenr_T line_count;
--- 2457,2462 ----
***************
*** 2483,2488 ****
--- 2473,2479 ----
int old_empty_rows = curwin->w_empty_rows;
linenr_T cln; // Cursor Line Number
long so = get_scrolloff_value();
+ int do_sms = curwin->w_p_wrap && curwin->w_p_sms;
cln = curwin->w_cursor.lnum;
if (set_topbot)
***************
*** 2504,2510 ****
break;
if (used + loff.height > curwin->w_height)
{
! if (curwin->w_p_sms && curwin->w_p_wrap)
{
// 'smoothscroll' and 'wrap' are set. The above line is
// too long to show in its entirety, so we show just a part
--- 2495,2501 ----
break;
if (used + loff.height > curwin->w_height)
{
! if (do_sms)
{
// 'smoothscroll' and 'wrap' are set. The above line is
// too long to show in its entirety, so we show just a part
***************
*** 2565,2579 ****
scrolled = used;
if (cln == curwin->w_botline)
scrolled -= curwin->w_empty_rows;
! min_scrolled = scrolled;
! if (curwin->w_p_sms && curwin->w_p_wrap)
{
! // 'smoothscroll' and 'wrap' are set
! if (cln > curwin->w_botline)
! // add screen lines below w_botline
! for (linenr_T lnum = curwin->w_botline + 1; lnum <= cln; ++lnum)
! min_scrolled += PLINES_NOFILL(lnum);
!
// Calculate how many screen lines the current top line of window
// occupies. If it is occupying more than the entire window, we
// need to scroll the additional clipped lines to scroll past the
--- 2556,2564 ----
scrolled = used;
if (cln == curwin->w_botline)
scrolled -= curwin->w_empty_rows;
! if (do_sms)
{
! // 'smoothscroll' and 'wrap' are set.
// Calculate how many screen lines the current top line of window
// occupies. If it is occupying more than the entire window, we
// need to scroll the additional clipped lines to scroll past the
***************
*** 2598,2604 ****
if (top_plines > curwin->w_height)
{
scrolled += (top_plines - curwin->w_height);
- min_scrolled += (top_plines - curwin->w_height);
}
}
}
--- 2583,2588 ----
***************
*** 2725,2746 ****
*/
if (line_count >= curwin->w_height && line_count > min_scroll)
scroll_cursor_halfway(FALSE, TRUE);
! else
{
! // With 'smoothscroll' scroll at least the height of the cursor line,
! // unless it would move the cursor.
! if (curwin->w_p_wrap && curwin->w_p_sms && line_count < min_scrolled
! && (curwin->w_cursor.lnum < curwin->w_topline
! || (curwin->w_virtcol - curwin->w_skipcol >=
! curwin->w_width - curwin_col_off())))
! line_count = min_scrolled;
! if (line_count > 0)
! {
! if (scrolling_screenlines(TRUE))
! scrollup(scrolled, TRUE); // TODO
! else
! scrollup(line_count, TRUE);
! }
}
/*
--- 2709,2720 ----
*/
if (line_count >= curwin->w_height && line_count > min_scroll)
scroll_cursor_halfway(FALSE, TRUE);
! else if (line_count > 0)
{
! if (do_sms)
! scrollup(scrolled, TRUE); // TODO
! else
! scrollup(line_count, TRUE);
}
/*
*** ../vim-9.0.1529/src/testdir/test_normal.vim 2023-05-07 17:39:19.807633903
+0100
--- src/testdir/test_normal.vim 2023-05-09 15:52:40.850639138 +0100
***************
*** 3980,3983 ****
--- 3980,4001 ----
call delete('Xmouseshapes')
endfunc
+ " Test that "j" does not skip lines when scrolling below botline and
+ " 'foldmethod' is not "manual".
+ func Test_normal_j_below_botline()
+ CheckScreendump
+
+ let lines =<< trim END
+ set number foldmethod=diff scrolloff=0
+ call setline(1, map(range(1, 9), 'repeat(v:val, 200)'))
+ norm Lj
+ END
+ call writefile(lines, 'XNormalJBelowBotline', 'D')
+ let buf = RunVimInTerminal('-S XNormalJBelowBotline', #{rows: 19, cols: 40})
+
+ call VerifyScreenDump(buf, 'Test_normal_j_below_botline', {})
+
+ call StopVimInTerminal(buf)
+ endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
*** ../vim-9.0.1529/src/testdir/dumps/Test_normal_j_below_botline.dump
2023-05-09 16:00:31.858876495 +0100
--- src/testdir/dumps/Test_normal_j_below_botline.dump 2023-05-09
15:52:40.846639135 +0100
***************
*** 0 ****
--- 1,19 ----
+ | +0#af5f00255#ffffff0@1|2| |2+0#0000000&@35
+ | +0#af5f00255&@3|2+0#0000000&@35
+ | +0#af5f00255&@3|2+0#0000000&@35
+ | +0#af5f00255&@3|2+0#0000000&@35
+ | +0#af5f00255&@3|2+0#0000000&@35
+ | +0#af5f00255&@3|2+0#0000000&@19| @15
+ | +0#af5f00255&@1|3| |3+0#0000000&@35
+ | +0#af5f00255&@3|3+0#0000000&@35
+ | +0#af5f00255&@3|3+0#0000000&@35
+ | +0#af5f00255&@3|3+0#0000000&@35
+ | +0#af5f00255&@3|3+0#0000000&@35
+ | +0#af5f00255&@3|3+0#0000000&@19| @15
+ | +0#af5f00255&@1|4| >4+0#0000000&@35
+ | +0#af5f00255&@3|4+0#0000000&@35
+ | +0#af5f00255&@3|4+0#0000000&@35
+ | +0#af5f00255&@3|4+0#0000000&@35
+ | +0#af5f00255&@3|4+0#0000000&@35
+ | +0#af5f00255&@3|4+0#0000000&@19| @15
+ @22|4|,|1| @10|1|6|%|
*** ../vim-9.0.1529/src/version.c 2023-05-09 14:59:55.964088966 +0100
--- src/version.c 2023-05-09 15:55:27.242763534 +0100
***************
*** 697,698 ****
--- 697,700 ----
{ /* Add new patch number below this line */
+ /**/
+ 1530,
/**/
--
hundred-and-one symptoms of being an internet addict:
28. You have comandeered your teenager's phone line for the net and even his
friends know not to call on his line anymore.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// \\\
\\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/20230509150155.43E301C1B21%40moolenaar.net.