From 3128647a5f880e5da78719a131d016274af88324 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Mon, 22 Sep 2025 06:49:00 +0100 Subject: [PATCH] reimplement 'k' motion so that newlines which are immediately preceded by non-newline chars are skipped --- fcore/normal-mode/normal-move.sml | 52 +++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/fcore/normal-mode/normal-move.sml b/fcore/normal-mode/normal-move.sml index 6e42ae9..daf57b6 100644 --- a/fcore/normal-mode/normal-move.sml +++ b/fcore/normal-mode/normal-move.sml @@ -184,24 +184,42 @@ struct (* calculate new idx to move to *) val buffer = LineGap.goToIdx (cursorIdx, buffer) 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 - 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 fun moveCursorDown (app: app_type, count) =