To: vim_dev@googlegroups.com Subject: Patch 9.0.1530 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///