reimplement 'k' motion so that newlines which are immediately preceded by non-newline chars are skipped

This commit is contained in:
2025-09-22 06:49:00 +01:00
parent 4dc73aa4d6
commit 3128647a5f

View File

@@ -184,24 +184,42 @@ struct
(* calculate new idx to move to *) (* calculate new idx to move to *)
val buffer = LineGap.goToIdx (cursorIdx, buffer) val buffer = LineGap.goToIdx (cursorIdx, buffer)
val startOfLine = Cursor.vi0 (buffer, cursorIdx) val startOfLine = Cursor.vi0 (buffer, cursorIdx)
val column = cursorIdx - startOfLine
val cursorLineNumber =
if Cursor.isNextChrEndOfLine (buffer, cursorIdx) then
LineGap.idxToLineNumber (cursorIdx + 1, buffer)
else
LineGap.idxToLineNumber (cursorIdx, buffer)
val newCursorLineNumber = Int.max (cursorLineNumber - count, 0)
val column = if newCursorLineNumber = 0 then column - 1 else column
val buffer = LineGap.goToLine (newCursorLineNumber, buffer)
val lineIdx = LineGap.lineNumberToIdx (newCursorLineNumber, buffer)
val buffer = LineGap.goToIdx (lineIdx, buffer)
val lineIdx =
if Cursor.isNextChrEndOfLine (buffer, lineIdx) then lineIdx
else lineIdx + 1
in in
finishMoveCursorUpDown (app, newCursorLineNumber, buffer, column, lineIdx) if Cursor.isCursorAtStartOfLine (buffer, cursorIdx) then
let
val cursorLineNumber = LineGap.idxToLineNumber (cursorIdx + 1, buffer)
val newCursorLineNumber = Int.max (0, cursorLineNumber - count)
val buffer = LineGap.goToLine (newCursorLineNumber, buffer)
val lineIdx = LineGap.lineNumberToIdx (newCursorLineNumber, buffer)
val lineIdx =
if Cursor.isPrevChrStartOfLine (buffer, lineIdx) then lineIdx
else lineIdx - 1
val buffer = LineGap.goToIdx (lineIdx, buffer)
val lineIdx = Cursor.vi0 (buffer, lineIdx)
val lineIdx = Int.max (0, lineIdx)
in
finishMoveCursorUpDown (app, newCursorLineNumber, buffer, 0, lineIdx)
end
else
let
val cursorLineNumber = LineGap.idxToLineNumber (cursorIdx, buffer)
val newCursorLineNumber = Int.max (cursorLineNumber - count, 0)
val column = cursorIdx - startOfLine
val column =
if newCursorLineNumber = 0 then Int.max (column - 1, 0) else column
val buffer = LineGap.goToLine (newCursorLineNumber, buffer)
val lineIdx =
LineGap.lineNumberToIdx (newCursorLineNumber, buffer) + 1
in
finishMoveCursorUpDown
(app, newCursorLineNumber, buffer, column, lineIdx)
end
end end
fun moveCursorDown (app: app_type, count) = fun moveCursorDown (app: app_type, count) =