summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJackson Moore <jacksonmoore@tuta.io>2026-09-04 12:04:58 +0200
committerJackson Moore <jacksonmoore@tuta.io>2026-09-04 12:04:58 +0200
commit3402c8557af220be7129b3bed0d2fa93eac4a724 (patch)
tree75aecf52053d156927af1b34265d501af94e0eb5
parentd63e27bd72b4a9f66960656ac9e1b77d99ac1115 (diff)
Read previous acquisition target
-rw-r--r--lua/clever_f/acquisition_service.lua27
-rw-r--r--tests/run.lua6
2 files changed, 33 insertions, 0 deletions
diff --git a/lua/clever_f/acquisition_service.lua b/lua/clever_f/acquisition_service.lua
index 45463e6..bf3a5e9 100644
--- a/lua/clever_f/acquisition_service.lua
+++ b/lua/clever_f/acquisition_service.lua
@@ -140,6 +140,8 @@ function AcquisitionResult.new(request, options)
motion_plan = options.motion_plan,
resolved_motion_plan = options.motion_plan,
previous_input_trigger = options.previous_input_trigger,
+ previous_target_source = options.previous_target_source,
+ cached_target = options.cached_target,
completed = outcome ~= nil or target ~= nil,
}
return result
@@ -182,6 +184,8 @@ function TemporaryResourceScope.new(request, feedback)
input_packet = nil,
acquired_target = nil,
previous_input_trigger = nil,
+ previous_target_source = nil,
+ cached_target = nil,
outcome = nil,
}
return scope
@@ -224,6 +228,11 @@ function TemporaryResourceScope:set_previous_input_trigger(trigger)
return set_scope_resource(self, "previous_input_trigger", trigger)
end
+function TemporaryResourceScope:set_cached_target(context, target)
+ set_scope_resource(self, "previous_target_source", context)
+ return set_scope_resource(self, "cached_target", target)
+end
+
function TemporaryResourceScope:set_outcome(outcome)
if not domain.ActionOutcome.is(outcome) then
fail("temporary resource scope outcome must be an ActionOutcome", 2)
@@ -325,6 +334,7 @@ function AcquisitionService.new(options, dependencies)
service_records[service] = {
host = options.host,
policy = policy_service,
+ state = state,
transitions = transitions,
feedback = require_feedback(
options.feedback or options.feedback_service,
@@ -486,6 +496,17 @@ function M.normalize_input_packet(packet)
return M.normalize_ordinary_input(domain.InputPacket.text(encoded))
end
+function M.read_previous_target(state)
+ if not sequence_state.is(state) then
+ fail("previous-input reuse requires SequenceState", 2)
+ end
+ local context = state.last_input_context
+ if context == nil then
+ return nil, nil
+ end
+ return state:get_previous_target(context), context
+end
+
function M.match_previous_input_trigger(first_code, triggers)
if type(first_code) ~= "number" or first_code < 0 then
fail("acquired first code must be nonnegative", 2)
@@ -608,9 +629,15 @@ function AcquisitionService:acquire(descriptor, context, position, count, macro_
previous_input.repeat_last_char_inputs
)
)
+ if trigger ~= nil then
+ local cached_target, source = M.read_previous_target(record.state)
+ scope:set_cached_target(source, cached_target)
+ end
return AcquisitionResult.new(request, {
target = target,
previous_input_trigger = trigger,
+ previous_target_source = scope.previous_target_source,
+ cached_target = scope.cached_target,
})
end
diff --git a/tests/run.lua b/tests/run.lua
index 7b50190..89f6273 100644
--- a/tests/run.lua
+++ b/tests/run.lua
@@ -5239,6 +5239,12 @@ test("Acquisition compares first codes with previous-input triggers", function()
)
same("xy", result.previous_input_trigger)
same("xy", service:last_temporary_scope().previous_input_trigger)
+ same(
+ domain.TargetValue.character("h", 104),
+ service:last_temporary_scope().cached_target
+ )
+ same(domain.ModeContext.from_full_mode("v"), result.previous_target_source)
+ same(service:last_temporary_scope().cached_target, result.cached_target)
local trigger, index = acquisition_service.match_previous_input_trigger(
0x3042,
{ "x", "\227\129\130more" }