diff --git a/fcore/cursor.sml b/fcore/cursor.sml index 3b13156..09dbf38 100644 --- a/fcore/cursor.sml +++ b/fcore/cursor.sml @@ -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 diff --git a/fcore/normal-mode/normal-delete.sml b/fcore/normal-mode/normal-delete.sml index 2150945..954aa54 100644 --- a/fcore/normal-mode/normal-delete.sml +++ b/fcore/normal-mode/normal-delete.sml @@ -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 diff --git a/fcore/normal-mode/normal-mode.sml b/fcore/normal-mode/normal-mode.sml index 1921474..d9a102a 100644 --- a/fcore/normal-mode/normal-mode.sml +++ b/fcore/normal-mode/normal-mode.sml @@ -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 *)