patch 9.0.0701: with 'smoothscroll' cursor position not adjusted in long line
Problem: With 'smoothscroll' the cursor position s not adjusted in a long
line.
Solution: Move the cursor further up or down in the line.
diff --git a/src/move.c b/src/move.c
index 139ee17..613791e 100644
--- a/src/move.c
+++ b/src/move.c
@@ -1602,6 +1602,27 @@
#endif
coladvance(curwin->w_curswant);
}
+
+ if (curwin->w_cursor.lnum == curwin->w_topline && do_sms)
+ {
+ // make sure the cursor is in the visible text
+ validate_virtcol();
+ int col = curwin->w_virtcol - curwin->w_skipcol;
+ int row = 0;
+ if (col >= width1)
+ {
+ col -= width1;
+ ++row;
+ }
+ if (col > width2)
+ {
+ row += col / width2;
+ col = col % width2;
+ }
+ if (row >= curwin->w_height)
+ coladvance(curwin->w_virtcol
+ - (row - curwin->w_height + 1) * width2);
+ }
}
/*
@@ -1651,8 +1672,7 @@
// for a closed fold: go to the last line in the fold
(void)hasFolding(lnum, NULL, &lnum);
# endif
- if (lnum == curwin->w_topline
- && curwin->w_p_wrap && curwin->w_p_sms)
+ if (lnum == curwin->w_topline && do_sms)
{
// 'smoothscroll': increase "w_skipcol" until it goes over
// the end of the line, then advance to the next line.
@@ -1725,6 +1745,24 @@
~(VALID_WROW|VALID_WCOL|VALID_CHEIGHT|VALID_CROW|VALID_VIRTCOL);
coladvance(curwin->w_curswant);
}
+ if (curwin->w_cursor.lnum == curwin->w_topline
+ && do_sms && curwin->w_skipcol > 0)
+ {
+ // make sure the cursor is in a visible part of the line
+ validate_virtcol();
+ if (curwin->w_virtcol < curwin->w_skipcol + 3)
+ {
+ int width1 = curwin->w_width - curwin_col_off();
+ int width2 = width1 + curwin_col_off2();
+ colnr_T col = curwin->w_virtcol;
+
+ if (col < width1)
+ col += width1;
+ while (col < curwin->w_skipcol + 3)
+ col += width2;
+ coladvance(col);
+ }
+ }
}
#ifdef FEAT_DIFF