Patch 9.0.0807

7 views
Skip to first unread message

Bram Moolenaar

unread,
Oct 20, 2022, 3:54:15 PM10/20/22
to vim...@googlegroups.com

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 -- Br...@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 ///
Reply all
Reply to author
Forward
0 new messages