summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJackson Moore <jacksonmoore@tuta.io>2026-09-04 12:38:49 +0200
committerJackson Moore <jacksonmoore@tuta.io>2026-09-04 12:38:49 +0200
commit612775c292ccd58fba666728497b0a469101c578 (patch)
treedc9311c0b22bbb460068a84dd7f1c77aa25f4684
parent107d14db6ac0731215c3e34eebe1c06b4e8fdb6a (diff)
Finalize insert and text events
-rw-r--r--lua/clever_f/feedback_service.lua11
-rw-r--r--tests/run.lua34
2 files changed, 45 insertions, 0 deletions
diff --git a/lua/clever_f/feedback_service.lua b/lua/clever_f/feedback_service.lua
index 6fb40df..061ed1d 100644
--- a/lua/clever_f/feedback_service.lua
+++ b/lua/clever_f/feedback_service.lua
@@ -47,6 +47,11 @@ local LEGACY_NORMAL_EX_CONTEXTS = {
cvr = true,
}
+local DIRECT_FINALIZER_EVENTS = {
+ InsertEnter = true,
+ TextChanged = true,
+}
+
local DEFAULT_LABEL_DEFINITION = {
guifg = "red",
guibg = "NONE",
@@ -501,6 +506,12 @@ function FeedbackService:handle_finalizer_event(name, payload)
end
return decision
end
+ if DIRECT_FINALIZER_EVENTS[name] then
+ return {
+ action = M.FinalizerAction.FINALIZE,
+ cleanup = self:full_finalize(payload and payload.window),
+ }
+ end
return false
end
diff --git a/tests/run.lua b/tests/run.lua
index 2fe0460..2a0786f 100644
--- a/tests/run.lua
+++ b/tests/run.lua
@@ -6227,6 +6227,40 @@ test("Different CursorMoved applies full finalization", function()
same(0, #state.finalizers)
end)
+test("Insert and text events finalize feedback directly", function()
+ for _, event_name in ipairs({ "InsertEnter", "TextChanged" }) do
+ local state, transitions = fresh_sequence_state()
+ local host = MemoryHost.new({ buffer_lines = { "aba" } })
+ local feedback = feedback_service.new({
+ host = host,
+ transitions = transitions,
+ })
+ local shared_target = target_plan.build(target("a"), matching_policy())
+ local movement = motion_plan.build(shared_target, "f")
+ transitions:BeginAcquisition("n", "f")
+ transitions:CommitAcquiredTarget("n", target("a"))
+ transitions:CommitCommandSuccess(
+ "n",
+ domain.Position.new(1, 3),
+ domain.Direction.FORWARD
+ )
+ feedback:request_persistent({
+ context = "n",
+ anchor = domain.Position.new(1, 1),
+ target_plan = shared_target,
+ motion_plan = movement,
+ window = "window-1",
+ })
+
+ host:deliver_event(event_name, {})
+
+ same(nil, state:get_previous_landing("n"), event_name)
+ falsy(state.moved_forward, event_name)
+ same(0, #state.target_overlays, event_name)
+ same(0, #state.finalizers, event_name)
+ end
+end)
+
for _, item in ipairs(tests) do
local ok, failure = xpcall(item.body, debug.traceback)
if not ok then