summaryrefslogtreecommitdiff
path: root/src/modal.zig
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-09-28 17:04:53 -0300
committerGabriel Schneider <[email protected]>2026-10-01 00:12:15 -0300
commitdf4d11bb95bc7ea9554b55d2211c4704a2594f08 (patch)
tree0b3a41bac163f6dc1e5c403e0c7a5547c482ec60 /src/modal.zig
parent68e30f560e46bb9a30433eb23b4edb1b93d69f46 (diff)
downloadpardes-df4d11bb95bc7ea9554b55d2211c4704a2594f08.tar.gz
pardes-df4d11bb95bc7ea9554b55d2211c4704a2594f08.zip
]f, mif and the other textobject keys use helix's own queries
helix's textobjects.scm for pardes's grammars are vendored in vendor/queries under MPL-2.0, each with a header naming its source and what it inherits, inlined; a README says what is there and what is not. syntax.objectAt and objectNext run them over the file's kept parse, with their #eq? and #match? predicates, for ]f [f ]t [t ]a [a ]c [c ]T [T ]e [e ]x [x and mi/ma with f t a c T e x. erlang's and zig's queries do not compile against the grammar versions pardes builds and are left out; fortran, markdown and powershell have none in helix. A test replays sixteen Python and JSON cases whose results were taken from the installed hx, and another holds that every vendored query compiles. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Diffstat (limited to 'src/modal.zig')
-rw-r--r--src/modal.zig12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/modal.zig b/src/modal.zig
index 6371475c..cc7f1ebd 100644
--- a/src/modal.zig
+++ b/src/modal.zig
@@ -54,6 +54,13 @@ pub const Normal = struct {
add_newline,
goto_diagnostic,
goto_diagnostic_end,
+ goto_function,
+ goto_class,
+ goto_parameter,
+ goto_comment,
+ goto_test,
+ goto_entry,
+ goto_xml_element,
move_left,
move_right,
@@ -229,6 +236,8 @@ pub const Normal = struct {
};
/// helix's tree-sitter selection keys: where a range goes in the tree
+ /// helix's tree-sitter textobjects, by what their queries call them
+ pub const Object = enum { function, class, parameter, comment, @"test", entry, xml_element };
pub const NodeWalk = enum { expand, shrink, next_sibling, prev_sibling, all_siblings, all_children, parent_end, parent_start };
/// what the s/S/K/Alt-K prompt does with its pattern's matches
pub const RegexMode = enum { select, split, keep, remove };
@@ -351,6 +360,7 @@ pub const Normal = struct {
macro_record,
macro_replay: u32,
node: NodeWalk,
+ object_jump: struct { object: Object, direction: Direction, count: u32 },
repeat_insert: u32,
pub fn scope(value: Action) Scope {
@@ -540,6 +550,8 @@ pub const Normal = struct {
if (key.has(.add_newline)) return resultAction(.{ .add_newline = .{ .direction = direction, .count = count } });
if (key.has(.goto_diagnostic)) return resultAction(.{ .diagnostic = .{ .direction = direction, .endpoint = false } });
if (key.has(.goto_diagnostic_end)) return resultAction(.{ .diagnostic = .{ .direction = direction, .endpoint = true } });
+ inline for (.{ .{ .goto_function, .function }, .{ .goto_class, .class }, .{ .goto_parameter, .parameter }, .{ .goto_comment, .comment }, .{ .goto_test, .@"test" }, .{ .goto_entry, .entry }, .{ .goto_xml_element, .xml_element } }) |pair|
+ if (key.has(pair[0])) return resultAction(.{ .object_jump = .{ .object = pair[1], .direction = direction, .count = count } });
return .ignored;
},
.register => {