From 0bfe549e04071eeaea0e8c43c72f5a8af888effd Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Sat, 23 Nov 2024 05:16:37 +0000 Subject: [PATCH] add just one more 'word' test, extract steps to delete from search list into a reusable function (don't need to memorise the steps), and fix bug in cursor.sml where we were looking at tl without calculating correct strIdx --- fcore/app-update.sml | 20 ++++++++++++-------- fcore/cursor.sml | 3 ++- test/test.sml | 16 ++++++++++++++++ 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/fcore/app-update.sml b/fcore/app-update.sml index e478e79..57374d9 100644 --- a/fcore/app-update.sml +++ b/fcore/app-update.sml @@ -363,6 +363,16 @@ struct (* text-delete functions *) (** equivalent of vi's 'x' command **) + + fun deleteSearchList (cursorIdx, length, searchString, searchList, buffer) = + let + val searchList = SearchList.delete (cursorIdx, length, searchString, searchList) + val searchList = SearchList.mapFrom (cursorIdx, ~length, searchList) + in + BuildSearchList.fromRange + (cursorIdx, length, buffer, searchString, searchList) + end + fun helpRemoveChr (app: app_type, buffer, searchList, cursorIdx, count) = if count = 0 then let @@ -423,11 +433,8 @@ struct val {searchString, ...} = app val buffer = LineGap.delete (cursorIdx, 1, buffer) - val searchList = SearchList.delete (cursorIdx, 1, searchString, searchList) - val searchList = SearchList.mapFrom (cursorIdx, ~1, searchList) val (buffer, searchList) = - BuildSearchList.fromRange - (cursorIdx, 1, buffer, searchString, searchList) + deleteSearchList (cursorIdx, 1, searchString, searchList, buffer) val cursorIdx = if @@ -443,11 +450,8 @@ struct val {searchString, ...} = app val buffer = LineGap.delete (cursorIdx, 1, buffer) - val searchList = SearchList.delete (cursorIdx, 1, searchString, searchList) - val searchList = SearchList.mapFrom (cursorIdx, ~1, searchList) val (buffer, searchList) = - BuildSearchList.fromRange - (cursorIdx, 1, buffer, searchString, searchList) + deleteSearchList (cursorIdx, 1, searchString, searchList, buffer) in helpRemoveChr (app, buffer, searchList, cursorIdx, count - 1) end diff --git a/fcore/cursor.sml b/fcore/cursor.sml index 3295934..3cc3bbc 100644 --- a/fcore/cursor.sml +++ b/fcore/cursor.sml @@ -1732,7 +1732,8 @@ struct (* strIdx is in tl *) (case tl of tlhd :: tltl => - helpIsNextChrEndOfLine (strIdx, tlhd, tltl) + helpIsNextChrEndOfLine + (strIdx - String.size hd, tlhd, tltl) | [] => (* strIdx is at end of lineGap * which also means at end of line *) diff --git a/test/test.sml b/test/test.sml index e73cb4c..02db4b8 100644 --- a/test/test.sml +++ b/test/test.sml @@ -730,6 +730,22 @@ val wMove = describe "move motion 'w'" in Expect.isTrue (cursorChr = #"7") end) + + , test "moves cursor to first alphanumeric char when in punctuation" (fn _ => + let + (* arrange *) + val buffer = LineGap.fromString "!!! hello\n" + val app = AppType.init (buffer, 0, 0) + + (* act *) + val (app1, _) = AppUpdate.update (app, CHAR_EVENT #"w") + + (* assert *) + val startsAtExc = getChr app = #"!" + val movedToH = getChr app1 = #"h" + in + Expect.isTrue (startsAtExc andalso movedToH) + end) ] val tests = concat [hMove, lMove, jMove, kMove, wMove]