diff --git a/fcore/normal-mode/make-normal-delete.sml b/fcore/normal-mode/make-normal-delete.sml index 99ae1fe..76a48e3 100644 --- a/fcore/normal-mode/make-normal-delete.sml +++ b/fcore/normal-mode/make-normal-delete.sml @@ -740,6 +740,21 @@ struct end end + fun deleteTillNextChr (app: app_type, count, chr, time) = + let + val {buffer, cursorIdx, ...} = app + val buffer = LineGap.goToIdx (cursorIdx, buffer) + val newCursorIdx = + Cursor.toNextChrNew (buffer, cursorIdx, {findChr = chr, count = count}) + in + if newCursorIdx = ~1 then + NormalFinish.clearMode app + else + let val length = newCursorIdx - cursorIdx + in deleteAndFinish (app, cursorIdx, length, buffer, time) + end + end + fun deleteToStart (app: app_type, time) : AppType.app_type = let val {cursorIdx, buffer, windowWidth, windowHeight, dfa, ...} = app diff --git a/fcore/normal-mode/normal-mode.sml b/fcore/normal-mode/normal-mode.sml index 59f4800..b7b0142 100644 --- a/fcore/normal-mode/normal-mode.sml +++ b/fcore/normal-mode/normal-mode.sml @@ -298,9 +298,7 @@ struct else (* have to continue parsing string *) case String.sub (str, strPos + 1) of - #"t" => - NormalDelete.deleteToChr - (app, 1, Cursor.tillNextChr, op+, chrCmd, time) + #"t" => NormalDelete.deleteTillNextChr (app, count, chrCmd, time) | #"T" => NormalDelete.deleteToChr (app, 1, Cursor.tillPrevChr, op-, chrCmd, time) diff --git a/test/normal-delete.sml b/test/normal-delete.sml index 65aca5f..54f597d 100644 --- a/test/normal-delete.sml +++ b/test/normal-delete.sml @@ -3707,7 +3707,7 @@ struct andalso cursorIdx = expectedCursorIdx) end) , test - "deletes up to just one occurrence \ + "deletes up to (excluding) last occurrence of chr \ \when motion has a count greater than 1" (fn _ => let @@ -3721,7 +3721,7 @@ struct (* assert *) val actualString = LineGap.toString buffer - val expectedString = "o world\n" + val expectedString = "orld\n" val expectedCursorIdx = 0 in Expect.isTrue