Move a caret by lineDelta visual lines (negative = up), keeping the
horizontal position — pass desiredX to preserve a sticky column across
repeated moves. Unlike moveCaretVertically, overshooting the first
or last line clamps to that line (preserving the column) rather than
jumping to the very start/end of the text — the behavior wanted for
PageUp/PageDown.
Move a caret by
lineDeltavisual lines (negative = up), keeping the horizontal position — passdesiredXto preserve a sticky column across repeated moves. Unlike moveCaretVertically, overshooting the first or last line clamps to that line (preserving the column) rather than jumping to the very start/end of the text — the behavior wanted for PageUp/PageDown.