diff options
| -rw-r--r-- | lua/clever_f/feedback_service.lua | 18 | ||||
| -rw-r--r-- | tests/run.lua | 35 |
2 files changed, 48 insertions, 5 deletions
diff --git a/lua/clever_f/feedback_service.lua b/lua/clever_f/feedback_service.lua index edaa39d..ac5f54b 100644 --- a/lua/clever_f/feedback_service.lua +++ b/lua/clever_f/feedback_service.lua @@ -712,23 +712,33 @@ function FeedbackService:cancel_highlight_timer() return identity end -function FeedbackService:handle_highlight_timer(callback_identity) +function FeedbackService:handle_highlight_timer(callback_identity, window) if callback_identity == nil then fail("highlight timer callback identity must be present", 2) end - return callback_identity == service_records[self].state.highlight_timer + local record = service_records[self] + if callback_identity ~= record.state.highlight_timer then + return false + end + local _, current = record.transitions:ClearHighlightTimer(callback_identity) + if not current then + return false + end + self:remove_character_overlays(window or record.host:read_window()) + return true end -function FeedbackService:start_highlight_timer() +function FeedbackService:start_highlight_timer(window) local record = service_records[self] local delay = self:highlight_timer_delay() if delay == nil then return nil end + window = window or record.host:read_window() self:cancel_highlight_timer() local identity identity = record.host:start_timer(delay, function(callback_identity) - self:handle_highlight_timer(callback_identity or identity) + self:handle_highlight_timer(callback_identity or identity, window) end) record.transitions:SetHighlightTimer(identity) return identity diff --git a/tests/run.lua b/tests/run.lua index c3e7009..cdda346 100644 --- a/tests/run.lua +++ b/tests/run.lua @@ -6663,7 +6663,40 @@ test("Timer callbacks compare their identity with current state", function() falsy(feedback:handle_highlight_timer(stale)) same(current, state.highlight_timer) truthy(feedback:handle_highlight_timer(current)) - same(current, state.highlight_timer) + same(nil, state.highlight_timer) +end) + +test("Current timer callback clears timer and character overlays", function() + local state, transitions = fresh_sequence_state() + local host = MemoryHost.new({ + buffer_lines = { "aba" }, + configuration = { + mark_char = true, + highlight_timeout_ms = 30, + }, + }) + 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") + local persistent = feedback:request_persistent({ + context = "n", + anchor = domain.Position.new(1, 1), + target_plan = shared_target, + motion_plan = movement, + window = "window-1", + }) + local timer = feedback:start_highlight_timer("window-1") + + truthy(host:fire_timer(timer)) + + same(nil, state.highlight_timer) + same(0, #state.target_overlays) + same(nil, host:highlights()[persistent.identity]) + same(1, #state.finalizers) + falsy(host:timers()[timer].active) end) for _, item in ipairs(tests) do |
