From 76e14ea4914c559f2c53a01a27f914f8e00c7953 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Fri, 5 Sep 2025 23:46:10 +0100 Subject: [PATCH] add functions to yank to end-of-previous-character, and to yank from current line to start of buffer --- fcore/cursor-dfa/vi-caps-word-dfa.sml | 4 ++-- fcore/normal-mode/normal-mode.sml | 19 ++++++++++++----- fcore/normal-mode/normal-yank.sml | 30 +++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/fcore/cursor-dfa/vi-caps-word-dfa.sml b/fcore/cursor-dfa/vi-caps-word-dfa.sml index 50820bb..cbae3df 100644 --- a/fcore/cursor-dfa/vi-caps-word-dfa.sml +++ b/fcore/cursor-dfa/vi-caps-word-dfa.sml @@ -68,7 +68,7 @@ struct val startState = startState structure Folder = - MakeCharFolderNext + MakeCharFolderPrev (struct val startState = startState val tables = tables @@ -78,7 +78,7 @@ struct currentState = nonBlankAfterSpaceState end) - val fStart = Folder.foldNext + val fStart = Folder.foldPrev end) structure StartOfCurrentWORDFolder = diff --git a/fcore/normal-mode/normal-mode.sml b/fcore/normal-mode/normal-mode.sml index 5a10ad7..6bd9500 100644 --- a/fcore/normal-mode/normal-mode.sml +++ b/fcore/normal-mode/normal-mode.sml @@ -275,6 +275,15 @@ struct | #"a" => appendChr (app, chrCmd, str) | _ => NormalFinish.clearMode app + fun parseYankGo (count, app, chrCmd) = + case chrCmd of + #"e" => + NormalYank.yankWhenMovingBackPlusOne (app, Cursor.endOfPrevWord, count) + | #"E" => + NormalYank.yankWhenMovingBackPlusOne (app, Cursor.endOfPrevWORD, count) + | #"g" => NormalYank.yankToStart app + | _ => NormalFinish.clearMode app + fun parseYank (strPos, str, count, app, chrCmd, time) = if strPos = String.size str - 1 then parseYankTerminal (str, count, app, chrCmd, time) @@ -285,11 +294,11 @@ struct | #"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" => + | #"g" => parseYankGo (count, app, chrCmd) + (* + | #"i" => + | #"a" => + | #"d" => *) | _ => NormalFinish.clearMode app diff --git a/fcore/normal-mode/normal-yank.sml b/fcore/normal-mode/normal-yank.sml index 2677397..4b79f0d 100644 --- a/fcore/normal-mode/normal-yank.sml +++ b/fcore/normal-mode/normal-yank.sml @@ -56,6 +56,22 @@ struct NormalModeWith.modeAndBuffer (app, buffer, mode, [DRAW msg]) end + fun yankWhenMovingBackPlusOne (app: app_type, fMove, count) = + let + val {buffer, cursorIdx, ...} = app + + val buffer = LineGap.goToIdx (cursorIdx, buffer) + val low = fMove (buffer, cursorIdx, count) + + val length = (cursorIdx + 1) - low + val str = LineGap.substring (low, length, buffer) + + val msg = YANK str + val mode = NORMAL_MODE "" + in + NormalModeWith.modeAndBuffer (app, buffer, mode, [DRAW msg]) + end + fun yankWhenMovingForward (app: app_type, fMove, count) = let val {buffer, cursorIdx, ...} = app @@ -226,4 +242,18 @@ struct , fInc , chr ) + + fun yankToStart (app: app_type) = + let + val {cursorIdx, buffer, ...} = app + + val high = Cursor.viDlrForDelete (buffer, cursorIdx, 1) + val buffer = LineGap.goToIdx (high, buffer) + + val str = LineGap.substring (0, high, buffer) + val msg = YANK str + val mode = NORMAL_MODE "" + in + NormalModeWith.modeAndBuffer (app, buffer, mode, [DRAW msg]) + end end