To: vim_dev@googlegroups.com Subject: Patch 9.0.0807 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.0807 Problem: With 'smoothscroll' typing "0" may not go to the first column. Solution: Recompute w_cline_height when needed. Do not scroll up when it would move the cursor. Files: src/move.c, src/testdir/dumps/Test_smooth_long_9.dump *** ../vim-9.0.0806/src/move.c 2022-10-14 20:09:00.895207512 +0100 --- src/move.c 2022-10-20 19:49:30.767430247 +0100 *************** *** 62,67 **** --- 62,89 ---- } /* + * Return how many lines "lnum" will take on the screen, taking into account + * whether it is the first line, whether w_skipcol is non-zero and limiting to + * the window height. + */ + static int + plines_correct_topline(win_T *wp, linenr_T lnum) + { + int n; + #ifdef FEAT_DIFF + if (lnum == wp->w_topline) + n = plines_win_nofill(wp, lnum, FALSE) + wp->w_topfill; + else + #endif + n = plines_win(wp, lnum, FALSE); + if (lnum == wp->w_topline) + n = adjust_plines_for_skipcol(wp, n); + if (n > wp->w_height) + n = wp->w_height; + return n; + } + + /* * Compute wp->w_botline for the current wp->w_topline. Can be called after * wp->w_topline changed. */ *************** *** 105,118 **** else #endif { ! #ifdef FEAT_DIFF ! if (lnum == wp->w_topline) ! n = plines_win_nofill(wp, lnum, TRUE) + wp->w_topfill; ! else ! #endif ! n = plines_win(wp, lnum, TRUE); ! if (lnum == wp->w_topline) ! n = adjust_plines_for_skipcol(wp, n); } if ( #ifdef FEAT_FOLDING --- 127,133 ---- else #endif { ! n = plines_correct_topline(wp, lnum); } if ( #ifdef FEAT_FOLDING *************** *** 833,848 **** else #endif { ! int n; ! #ifdef FEAT_DIFF ! if (lnum == wp->w_topline) ! n = plines_win_nofill(wp, lnum, TRUE) + wp->w_topfill; ! else ! #endif ! n = plines_win(wp, lnum, TRUE); ! if (lnum++ == wp->w_topline) ! n = adjust_plines_for_skipcol(wp, n); ! wp->w_cline_row += n; } } } --- 848,855 ---- else #endif { ! wp->w_cline_row += plines_correct_topline(wp, lnum); ! ++lnum; } } } *************** *** 1660,1665 **** --- 1667,1688 ---- } /* + * 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 + # endif + ; + } + + /* * Scroll the current window up by "line_count" logical lines. "CTRL-E" */ void *************** *** 1669,1682 **** { 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 ! # endif ! ) { int width1 = curwin->w_width - curwin_col_off(); int width2 = width1 + curwin_col_off2(); --- 1692,1698 ---- { 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(); *************** *** 1829,1835 **** int scrolloff_cols = so == 0 ? 0 : width1 + (so - 1) * width2; int scrolled = FALSE; ! validate_virtcol(); if (curwin->w_cline_height == curwin->w_height) { // the line just fits in the window, don't scroll --- 1845,1851 ---- int scrolloff_cols = so == 0 ? 0 : width1 + (so - 1) * width2; int scrolled = FALSE; ! validate_cheight(); if (curwin->w_cline_height == curwin->w_height) { // the line just fits in the window, don't scroll *************** *** 1841,1846 **** --- 1857,1863 ---- return; } + validate_virtcol(); while (curwin->w_skipcol > 0 && curwin->w_virtcol < curwin->w_skipcol + 3 + scrolloff_cols) { *************** *** 2539,2548 **** scroll_cursor_halfway(FALSE); else { ! // With 'smoothscroll' scroll at least the height of the cursor line. ! if (curwin->w_p_wrap && curwin->w_p_sms && line_count < min_scrolled) line_count = min_scrolled; ! scrollup(line_count, TRUE); } /* --- 2556,2575 ---- scroll_cursor_halfway(FALSE); 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); ! } } /* *** ../vim-9.0.0806/src/testdir/dumps/Test_smooth_long_9.dump 2022-10-12 19:53:10.621726849 +0100 --- src/testdir/dumps/Test_smooth_long_9.dump 2022-10-20 19:50:06.083239149 +0100 *************** *** 1,6 **** ! |<+0#4040ff13#ffffff0@2|t+0#0000000&|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t ! |h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o ! |t|s| |o|f| |t|e|x>t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o ! |f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e |x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w ! |:|s|e|t| |s|c|r|o|l@1|o| @9|3|,|1|3|0| @8|B|o|t| --- 1,6 ---- ! |<+0#4040ff13#ffffff0@2|o+0#0000000&|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o ! |t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o ! |f| |t|e|x|t| |w|i>t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e |x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w ! |i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| ! @22|3|,|1|7|0| @8|B|o|t| *** ../vim-9.0.0806/src/version.c 2022-10-20 17:59:34.610510336 +0100 --- src/version.c 2022-10-20 20:12:31.351876602 +0100 *************** *** 697,698 **** --- 697,700 ---- { /* Add new patch number below this line */ + /**/ + 807, /**/ -- How come wrong numbers are never busy? /// 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 ///