implemented 'diw' and 'diW' commands for deleting inside a word or WORD

This commit is contained in:
2025-08-07 18:33:03 +01:00
parent c6f40ba9a0
commit b6960f4c68
3 changed files with 68 additions and 0 deletions

View File

@@ -604,9 +604,11 @@ struct
(* equivalent of vi's 'b' command *)
val prevWord = ViWordDfa.startOfCurrentWord
val prevWordStrict = ViWordDfa.startOfCurrentWordStrict
(* equivalent of vi's 'B' command *)
val prevWORD = ViWORDDfa.startOfCurrentWORD
val prevWORDStrict = ViWORDDfa.startOfCurrentWORDStrict
(* equivalent of vi's 'ge' command *)
val endOfPrevWord = ViWordDfa.endOfPrevWord

View File

@@ -380,4 +380,59 @@ struct
else
helpDeleteToMatch (app, newCursorIdx, cursorIdx)
end
fun deleteInsideWord (app: app_type) =
let
val {buffer, cursorIdx, searchString, ...} = app
val buffer = LineGap.goToIdx (cursorIdx, buffer)
val low = Cursor.prevWordStrict (buffer, cursorIdx, 1)
val high = Cursor.endOfWordForDelete (buffer, cursorIdx, 1)
in
if low = high then
app
else
let
val length = high - low
val buffer = LineGap.delete (low, length, buffer)
val buffer = LineGap.goToEnd buffer
val initialMsg = [SEARCH (buffer, searchString)]
val buffer = LineGap.goToIdx (low + 777, buffer)
val searchList =
SearchList.buildRange (buffer, searchString, low - 777)
val buffer = LineGap.goToIdx (low, buffer)
in
Finish.buildTextAndClear (app, buffer, low, searchList, initialMsg)
end
end
fun deleteInsideWORD (app: app_type) =
let
val {buffer, cursorIdx, searchString, ...} = app
val buffer = LineGap.goToIdx (cursorIdx, buffer)
val low = Cursor.prevWORDStrict (buffer, cursorIdx, 1)
val high = Cursor.endOfWORDForDelete (buffer, cursorIdx, 1)
in
if low = high then
app
else
let
val length = high - low
val buffer = LineGap.delete (low, length, buffer)
val buffer = LineGap.goToEnd buffer
val initialMsg = [SEARCH (buffer, searchString)]
val buffer = LineGap.goToIdx (low + 777, buffer)
val searchList =
SearchList.buildRange (buffer, searchString, low - 777)
val buffer = LineGap.goToIdx (low, buffer)
in
Finish.buildTextAndClear (app, buffer, low, searchList, initialMsg)
end
end
end

View File

@@ -146,6 +146,7 @@ struct
| #"f" => appendChr (app, chr, str)
| #"F" => appendChr (app, chr, str)
| #"g" => appendChr (app, chr, str)
| #"i" => appendChr (app, chr, str)
(* invalid command: reset mode *)
| _ => Finish.clearMode app)
| KEY_ESC => Finish.clearMode app
@@ -209,6 +210,16 @@ struct
Finish.resizeText (app, width, height)
| WITH_SEARCH_LIST searchList =>
Finish.withSearchList (app, searchList))
| #"i" =>
(case newCmd of
CHAR_EVENT #"w" => NormalDelete.deleteInsideWord app
| CHAR_EVENT #"W" => NormalDelete.deleteInsideWORD app
| CHAR_EVENT _ => Finish.clearMode app
| KEY_ESC => Finish.clearMode app
| RESIZE_EVENT (width, height) =>
Finish.resizeText (app, width, height)
| WITH_SEARCH_LIST searchList =>
Finish.withSearchList (app, searchList))
| _ => Finish.clearMode app
(* useful reference as list of non-terminal commands *)