summaryrefslogtreecommitdiff
path: root/lua
diff options
context:
space:
mode:
authorJackson Moore <jacksonmoore@tuta.io>2026-09-04 12:10:40 +0200
committerJackson Moore <jacksonmoore@tuta.io>2026-09-04 12:10:40 +0200
commit9a41328135ab2073d087de44ba577335d109c641 (patch)
treefb2397e8eb396c06ebb209216de58a6b3bc4a1aa /lua
parentb47d670d7613800633c91f9b22615fbd9f65c0de (diff)
Request eligible persistent feedback
Diffstat (limited to 'lua')
-rw-r--r--lua/clever_f/acquisition_service.lua26
-rw-r--r--lua/clever_f/feedback_service.lua44
2 files changed, 68 insertions, 2 deletions
diff --git a/lua/clever_f/acquisition_service.lua b/lua/clever_f/acquisition_service.lua
index 77d08ec..ba796fd 100644
--- a/lua/clever_f/acquisition_service.lua
+++ b/lua/clever_f/acquisition_service.lua
@@ -155,6 +155,7 @@ function AcquisitionResult.new(request, options)
cached_target = options.cached_target,
missing_previous_input = options.missing_previous_input == true,
acquisition_time_ms = options.acquisition_time_ms,
+ persistent_feedback_request = options.persistent_feedback_request,
completed = outcome ~= nil or target ~= nil,
}
return result
@@ -355,8 +356,11 @@ local function require_feedback(feedback, host, policy_service, transitions)
policy = policy_service,
transitions = transitions,
})
- if type(feedback) ~= "table" or type(feedback.create_cursor_marker) ~= "function" then
- fail("AcquisitionService feedback must create cursor markers", 3)
+ if type(feedback) ~= "table"
+ or type(feedback.create_cursor_marker) ~= "function"
+ or type(feedback.request_persistent) ~= "function"
+ then
+ fail("AcquisitionService feedback must manage acquisition markers", 3)
end
return feedback
end
@@ -760,11 +764,29 @@ function AcquisitionService:acquire(descriptor, context, position, count, macro_
search_scope
)
)
+ local persistent_feedback_request
+ if record.policy:sample_markers().mark_char
+ and feedback_service.persistent_context_eligible(request.context)
+ then
+ local window = scope.cursor_marker
+ and scope.cursor_marker.window
+ or scope.direct_marker
+ and scope.direct_marker.window
+ or current_window(record)
+ persistent_feedback_request = record.feedback:request_persistent({
+ context = request.context,
+ anchor = request.position,
+ target_plan = target_plan,
+ motion_plan = motion_plan,
+ window = window,
+ })
+ end
return AcquisitionResult.new(request, {
target = target,
target_plan = target_plan,
motion_plan = motion_plan,
acquisition_time_ms = acquisition_time_ms,
+ persistent_feedback_request = persistent_feedback_request,
previous_input_trigger = trigger,
previous_target_source = scope.previous_target_source,
cached_target = scope.cached_target,
diff --git a/lua/clever_f/feedback_service.lua b/lua/clever_f/feedback_service.lua
index b1a4233..2b100a4 100644
--- a/lua/clever_f/feedback_service.lua
+++ b/lua/clever_f/feedback_service.lua
@@ -133,6 +133,7 @@ function FeedbackService.new(options)
options.transitions or options.state_transitions,
options.state
),
+ persistent_requests = {},
}
return service
end
@@ -281,6 +282,49 @@ function FeedbackService:remove_temporary_overlay(resource)
return removed
end
+function M.persistent_context_eligible(context)
+ context = domain.ModeContext.from_full_mode(context)
+ return context.key == "n"
+ or context.visual_kind ~= nil
+ or context.select_kind ~= nil
+ or context.key == "cv"
+ or context.key == "cvr"
+end
+
+function FeedbackService:request_persistent(specification)
+ if type(specification) ~= "table" then
+ fail("persistent feedback request must be a table", 2)
+ end
+ local context = domain.ModeContext.from_full_mode(specification.context)
+ if not M.persistent_context_eligible(context) then
+ fail("persistent feedback request requires an eligible context", 2)
+ end
+ if not domain.TargetPlan.is(specification.target_plan) then
+ fail("persistent feedback request requires a TargetPlan", 2)
+ end
+ if not domain.ResolvedMotionPlan.is(specification.motion_plan) then
+ fail("persistent feedback request requires a ResolvedMotionPlan", 2)
+ end
+ local request = {
+ context = context,
+ anchor = domain.Position.coerce(specification.anchor),
+ target_plan = specification.target_plan,
+ motion_plan = specification.motion_plan,
+ window = specification.window,
+ }
+ local requests = service_records[self].persistent_requests
+ requests[#requests + 1] = request
+ return request
+end
+
+function FeedbackService:persistent_requests()
+ local result = {}
+ for index, request in ipairs(service_records[self].persistent_requests) do
+ result[index] = request
+ end
+ return result
+end
+
function FeedbackService:evaluate_feature_links()
local record = service_records[self]
local rules = record.policy:evaluate_highlight_links()