From 3992e9def8692710590deacbc20bd925e0f8d64a Mon Sep 17 00:00:00 2001 From: Gabriel Schneider Date: Mon, 28 Sep 2026 16:20:24 -0300 Subject: Q records keys into a register and q types them again; . repeats the last insert Macro.zig keeps keys to be typed again. Q records into @ (or ") in helix's key notation until the next Q; q replays a register's keys count times through the modal handling, where Esc does not hop panes and Enter, Tab and Space neither look, execute nor open the leader. . replays the normal command that entered the last insert session once and what was typed in it count times (helix repeat_last_insert). a at the end of the text now adds the newline helix's append_mode does, which a terminal's text does not. helix-golf's invert_dictionary passes. Co-Authored-By: Claude Opus 5.5 --- src/modal.zig | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'src/modal.zig') diff --git a/src/modal.zig b/src/modal.zig index bce941d5..34c4dac7 100644 --- a/src/modal.zig +++ b/src/modal.zig @@ -129,6 +129,9 @@ pub const Normal = struct { insert_output, append_output, keep_pipe, + macro_record, + macro_replay, + repeat_insert, search, search_next, search_prev, @@ -320,6 +323,9 @@ pub const Normal = struct { pipe_selection: PipeBehavior, search, search_step: Direction, + macro_record, + macro_replay: u32, + repeat_insert: u32, pub fn scope(value: Action) Scope { return switch (value) { @@ -331,6 +337,9 @@ pub const Normal = struct { .pipe_selection, .search, .search_step, + .macro_record, + .macro_replay, + .repeat_insert, => .once, .edit => |edit| switch (edit.kind) { .join_lines, @@ -602,6 +611,9 @@ pub const Normal = struct { if (key.has(.insert_output)) return resultAction(.{ .pipe_selection = .insert }); if (key.has(.append_output)) return resultAction(.{ .pipe_selection = .append }); if (key.has(.keep_pipe)) return resultAction(.{ .pipe_selection = .keep }); + if (key.has(.macro_record)) return resultAction(.macro_record); + if (key.has(.macro_replay)) return resultAction(.{ .macro_replay = count }); + if (key.has(.repeat_insert)) return resultAction(.{ .repeat_insert = count }); if (key.has(.search)) return resultAction(.search); if (key.has(.search_next)) return resultAction(.{ .search_step = .forward }); if (key.has(.search_prev)) return resultAction(.{ .search_step = .backward }); -- cgit v1.3