patch 9.0.1599: Cursor not adjusted when 'splitkeep' is not "cursor"
Problem: Cursor not adjusted when near top or bottom of window and
'splitkeep' is not "cursor".
Solution: Move boundary checks to outer cursor move functions, inner
functions should only return valid cursor positions. (Luuk van
Baal, closes #12480)
diff --git a/src/normal.c b/src/normal.c
index 0720134..4004d42 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -2359,11 +2359,13 @@
else
{
// to previous line
- if (!cursor_up_inner(curwin, 1))
+ if (curwin->w_cursor.lnum <= 1)
{
retval = FAIL;
break;
}
+ cursor_up_inner(curwin, 1);
+
linelen = linetabsize_str(ml_get_curline());
if (linelen > width1)
curwin->w_curswant += (((linelen - width1 - 1) / width2)
@@ -2386,12 +2388,15 @@
else
{
// to next line
- if (!cursor_down_inner(curwin, 1))
+ if (curwin->w_cursor.lnum
+ >= curwin->w_buffer->b_ml.ml_line_count)
{
retval = FAIL;
break;
}
+ cursor_down_inner(curwin, 1);
curwin->w_curswant %= width2;
+
// Check if the cursor has moved below the number display
// when width1 < width2 (with cpoptions+=n). Subtract width2
// to get a negative value for w_curswant, which will get