adjust functor to move by dfa so that we cannot go to the last char of the file if (last char is a newline and is preceded by a non-newline), but otherwise we can go to the last char of the file.

This commit is contained in:
2025-09-23 11:47:25 +01:00
parent 5fded45303
commit 5d20b81bcc
2 changed files with 24 additions and 5 deletions

View File

@@ -737,4 +737,9 @@ struct
end
| [] => true
end
(* Prerequisite: lineGap is moved to cursorIdx *)
fun isOnNewlineAfterChr (buffer, cursorIdx) =
cursorIdx > 0 andalso not (isPrevChrStartOfLine (buffer, cursorIdx))
andalso isCursorAtStartOfLine (buffer, cursorIdx)
end

View File

@@ -63,12 +63,26 @@ struct
val cursorIdx = Fn.fMove (buffer, cursorIdx, count)
val textLength = #textLength buffer
val cursorIdx =
if cursorIdx >= textLength - 1 then Int.max (textLength - 1, 0)
else cursorIdx
in
NormalFinish.buildTextAndClear
(app, buffer, cursorIdx, searchList, [], bufferModifyTime)
if cursorIdx >= textLength - 1 then
let
val cursorIdx = Int.max (textLength - 1, 0)
val buffer = LineGap.goToIdx (cursorIdx, buffer)
in
if Cursor.isOnNewlineAfterChr (buffer, cursorIdx) then
let
val cursorIdx = cursorIdx - 1
in
NormalFinish.buildTextAndClear
(app, buffer, cursorIdx, searchList, [], bufferModifyTime)
end
else
NormalFinish.buildTextAndClear
(app, buffer, cursorIdx, searchList, [], bufferModifyTime)
end
else
NormalFinish.buildTextAndClear
(app, buffer, cursorIdx, searchList, [], bufferModifyTime)
end
end