diff --git a/fcore/normal-mode/normal-mode.sml b/fcore/normal-mode/normal-mode.sml index f2bcbcd..5a10ad7 100644 --- a/fcore/normal-mode/normal-mode.sml +++ b/fcore/normal-mode/normal-mode.sml @@ -280,7 +280,18 @@ struct parseYankTerminal (str, count, app, chrCmd, time) else (* todo: handle non-terminal characters *) - app + case String.sub (str, strPos + 1) of + #"t" => NormalYank.yankToChr (app, 1, Cursor.tillNextChr, op+, chrCmd) + | #"T" => NormalYank.yankToChr (app, 1, Cursor.tillPrevChr, op-, chrCmd) + | #"f" => NormalYank.yankToChr (app, count, Cursor.toNextChr, op+, chrCmd) + | #"F" => NormalYank.yankToChr (app, count, Cursor.toPrevChr, op-, chrCmd) + (* todo: implement + | #"g" => + | #"i" => + | #"a" => + | #"d" => + *) + | _ => NormalFinish.clearMode app (* useful reference as list of non-terminal commands *) fun parseAfterCount (strPos, str, count, app, chrCmd, time) = diff --git a/fcore/normal-mode/normal-yank.sml b/fcore/normal-mode/normal-yank.sml index 82e3c4e..2677397 100644 --- a/fcore/normal-mode/normal-yank.sml +++ b/fcore/normal-mode/normal-yank.sml @@ -188,4 +188,42 @@ struct NormalModeWith.modeAndBuffer (app, buffer, mode, [DRAW msg]) end end + + fun helpYankToChr + (app: app_type, buffer, cursorIdx, otherIdx, count, fMove, fInc, chr) = + if count = 0 then + let + val low = Int.min (cursorIdx, otherIdx) + val high = Int.max (cursorIdx, otherIdx) + val length = high - low + + val buffer = LineGap.goToIdx (high, buffer) + val str = LineGap.substring (low, length, buffer) + val msg = YANK str + val mode = NORMAL_MODE "" + in + NormalModeWith.modeAndBuffer (app, buffer, mode, [DRAW msg]) + end + else + let + val buffer = LineGap.goToIdx (otherIdx, buffer) + val newOtherIdx = fMove (buffer, otherIdx, chr) + val newCount = if newOtherIdx = otherIdx then 0 else count - 1 + val newOtherIdx = fInc (newOtherIdx, 1) + in + helpYankToChr + (app, buffer, cursorIdx, newOtherIdx, newCount, fMove, fInc, chr) + end + + fun yankToChr (app: app_type, count, fMove, fInc, chr) = + helpYankToChr + ( app + , #buffer app + , #cursorIdx app + , #cursorIdx app + , count + , fMove + , fInc + , chr + ) end