diff options
| -rw-r--r-- | lua/clever_f/acquisition_service.lua | 27 | ||||
| -rw-r--r-- | tests/run.lua | 6 |
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" } |
