proposedY := c.Y - amount
if proposedY < 0 {
proposedY = 0
+ c.LastVisualX = 0
} else if proposedY >= c.buf.NumLines {
proposedY = c.buf.NumLines - 1
}
- if proposedY == c.Y {
- return
- }
- c.Y = proposedY
runes := []rune(c.buf.Line(c.Y))
- c.X = c.GetCharPosInLine(c.Y, c.LastVisualX)
- if c.X > len(runes) {
+ c.X = c.GetCharPosInLine(proposedY, c.LastVisualX)
+
+ if c.X > len(runes) || (amount < 0 && proposedY == c.Y) {
c.X = len(runes)
}
+
+ c.Y = proposedY
}
// DownN moves the cursor down N lines (if possible)