patch 8.1.2140: "gk" and "gj" do not work correctly in number column
Problem: "gk" and "gj" do not work correctly in number column.
Solution: Allow for a negative "curswant". (Zach Wegner, closes #4969)
diff --git a/src/normal.c b/src/normal.c
index 1fddeae..50f7b31 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -2499,17 +2499,18 @@
n = ((linelen - width1 - 1) / width2 + 1) * width2 + width1;
else
n = width1;
- if (curwin->w_curswant > (colnr_T)n + 1)
- curwin->w_curswant -= ((curwin->w_curswant - n) / width2 + 1)
- * width2;
+ if (curwin->w_curswant >= (colnr_T)n)
+ curwin->w_curswant = n - 1;
}
while (dist--)
{
if (dir == BACKWARD)
{
- if ((long)curwin->w_curswant > width2)
- // move back within line
+ if ((long)curwin->w_curswant >= width1)
+ // Move back within the line. This can give a negative value
+ // for w_curswant if width1 < width2 (with cpoptions+=n),
+ // which will get clipped to column 0.
curwin->w_curswant -= width2;
else
{
@@ -2557,6 +2558,12 @@
}
curwin->w_cursor.lnum++;
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
+ // clipped to column 0.
+ if (curwin->w_curswant >= width1)
+ curwin->w_curswant -= width2;
linelen = linetabsize(ml_get_curline());
}
}