From 88a1489a54980b30abc4d577a6e020a850f3c92c Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Fri, 26 Sep 2025 07:46:42 +0100 Subject: [PATCH] pass failing test case for 'dw'. When we delete to the end of the file and the position the cursor was previously at no longer exists, move cursor to last valid character in file. --- fcore/normal-mode/make-normal-delete.sml | 27 +++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/fcore/normal-mode/make-normal-delete.sml b/fcore/normal-mode/make-normal-delete.sml index 8bb7ebd..a83abcd 100644 --- a/fcore/normal-mode/make-normal-delete.sml +++ b/fcore/normal-mode/make-normal-delete.sml @@ -277,7 +277,32 @@ struct val initialMsg = Fn.initMsgs (low, length, buffer) val buffer = LineGap.delete (low, length, buffer) in - finishAfterDeletingBuffer (app, low, buffer, time, initialMsg) + if low >= #textLength buffer - 1 andalso #textLength buffer > 0 then + (* edge case: + * when we delete from the cursor's position to the end of a file, + * we have to move the cursor to be on the last char + * because the original cursor's position is no longer valid. *) + let + val newCursorIdx = Int.max (#textLength buffer - 1, 0) + val buffer = LineGap.goToIdx (newCursorIdx, buffer) + val newCursorIdx = + if Cursor.isOnNewlineAfterChr (buffer, newCursorIdx) then + newCursorIdx - 1 + else + newCursorIdx + in + finishAfterDeletingBuffer + (app, newCursorIdx, buffer, time, initialMsg) + end + else + let + val buffer = LineGap.goToIdx (low, buffer) + val newCursorIdx = + if Cursor.isOnNewlineAfterChr (buffer, low) then low - 1 else low + in + finishAfterDeletingBuffer + (app, newCursorIdx, buffer, time, initialMsg) + end end fun deleteByDfa (app as {buffer, ...}: app_type, count, fMove, time) =