diff options
| -rw-r--r-- | lua/clever_f/feedback_service.lua | 11 | ||||
| -rw-r--r-- | tests/run.lua | 34 |
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 |
