From 0506cf6176df2c1924c946f1cd7d67e782d012e9 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Sat, 6 Sep 2025 02:27:01 +0100 Subject: [PATCH] done implementing 'yankInside' functions and functionality. --- fcore/normal-mode/normal-mode.sml | 29 +++++++++----------- fcore/normal-mode/normal-yank.sml | 45 +++++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 18 deletions(-) diff --git a/fcore/normal-mode/normal-mode.sml b/fcore/normal-mode/normal-mode.sml index b9009ea..af212dd 100644 --- a/fcore/normal-mode/normal-mode.sml +++ b/fcore/normal-mode/normal-mode.sml @@ -125,10 +125,10 @@ struct fun parseDeleteAround (app, chr, time) = case chr of - #"(" => NormalDelete.deleteInsideChrOpen (app, chr, time) - | #"[" => NormalDelete.deleteInsideChrOpen (app, chr, time) - | #"{" => NormalDelete.deleteInsideChrOpen (app, chr, time) - | #"<" => NormalDelete.deleteInsideChrOpen (app, chr, time) + #"(" => NormalDelete.deleteAroundChrOpen (app, chr, time) + | #"[" => NormalDelete.deleteAroundChrOpen (app, chr, time) + | #"{" => NormalDelete.deleteAroundChrOpen (app, chr, time) + | #"<" => NormalDelete.deleteAroundChrOpen (app, chr, time) | #")" => NormalDelete.deleteAroundChrClose (app, chr, time) | #"]" => NormalDelete.deleteAroundChrClose (app, chr, time) | #"}" => NormalDelete.deleteAroundChrClose (app, chr, time) @@ -297,23 +297,20 @@ struct case chr of #"w" => NormalYank.yankInsideWord app | #"W" => NormalYank.yankInsideWORD app - (* - | #"(" => NormalDelete.deleteInsideChrOpen (app, chr) - | #"[" => NormalDelete.deleteInsideChrOpen (app, chr) - | #"{" => NormalDelete.deleteInsideChrOpen (app, chr) - | #"<" => NormalDelete.deleteInsideChrOpen (app, chr) - | #")" => NormalDelete.deleteInsideChrClose (app, chr) - | #"]" => NormalDelete.deleteInsideChrClose (app, chr) - | #"}" => NormalDelete.deleteInsideChrClose (app, chr) - | #">" => NormalDelete.deleteInsideChrClose (app, chr) - *) + | #"(" => NormalYank.yankInsideChrOpen (app, chr) + | #"[" => NormalYank.yankInsideChrOpen (app, chr) + | #"{" => NormalYank.yankInsideChrOpen (app, chr) + | #"<" => NormalYank.yankInsideChrOpen (app, chr) + | #")" => NormalYank.yankInsideChrClose (app, chr) + | #"]" => NormalYank.yankInsideChrClose (app, chr) + | #"}" => NormalYank.yankInsideChrClose (app, chr) + | #">" => NormalYank.yankInsideChrClose (app, chr) | _ => NormalFinish.clearMode app fun parseYank (strPos, str, count, app, chrCmd, time) = if strPos = String.size str - 1 then parseYankTerminal (str, count, app, chrCmd, time) else - (* todo: handle non-terminal characters *) 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) @@ -323,7 +320,7 @@ struct NormalYank.yankToChr (app, count, Cursor.toPrevChr, op-, chrCmd) | #"g" => parseYankGo (count, app, chrCmd) | #"i" => parseYankInside (app, chrCmd) - (* + (* todo: implement "yankaround" and "yankDelete" | #"a" => | #"d" => *) diff --git a/fcore/normal-mode/normal-yank.sml b/fcore/normal-mode/normal-yank.sml index 5b66048..fd69097 100644 --- a/fcore/normal-mode/normal-yank.sml +++ b/fcore/normal-mode/normal-yank.sml @@ -273,7 +273,7 @@ struct val msg = YANK str val mode = NORMAL_MODE "" in - if str = "\n" then app + if str = "\n" then NormalFinish.clearMode app else NormalModeWith.modeAndBuffer (app, buffer, mode, [DRAW msg]) end @@ -292,7 +292,48 @@ struct val msg = YANK str val mode = NORMAL_MODE "" in - if str = "\n" then app + if str = "\n" then NormalFinish.clearMode app else NormalModeWith.modeAndBuffer (app, buffer, mode, [DRAW msg]) end + + fun finishAfterYankInside (app: app_type, low, high, buffer) = + let + val length = high - 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 yankInsideChrOpen (app: app_type, chr) = + let + val {cursorIdx, buffer, ...} = app + + val start = cursorIdx + 1 + val buffer = LineGap.goToIdx (start, buffer) + + val low = Cursor.toPrevChr (buffer, start, chr) + val buffer = LineGap.goToIdx (low, buffer) + val high = Cursor.matchPair (buffer, low) + val buffer = LineGap.goToIdx (high, buffer) + in + if low = high then NormalFinish.clearMode app + else finishAfterYankInside (app, low + 1, high, buffer) + end + + fun yankInsideChrClose (app: app_type, chr) = + let + val {cursorIdx, buffer, ...} = app + + val start = Int.max (cursorIdx - 1, 0) + val buffer = LineGap.goToIdx (start, buffer) + + val high = Cursor.toNextChr (buffer, start, chr) + val buffer = LineGap.goToIdx (high, buffer) + val low = Cursor.matchPair (buffer, high) + in + if low = high then NormalFinish.clearMode app + else finishAfterYankInside (app, low, high, buffer) + end end