summaryrefslogtreecommitdiff
path: root/src/edit.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/edit.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/edit.zig')
-rw-r--r--src/edit.zig19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/edit.zig b/src/edit.zig
index 5437a67d..1b947749 100644
--- a/src/edit.zig
+++ b/src/edit.zig
@@ -1858,6 +1858,25 @@ fn pairFor(ch: u21) ?struct { o: u8, c: u8 } {
pub fn textobjectSelect(p: *Pardes, t: *Text, text: []const u8, obj: u21, around: bool) void {
const range = t.primaryRange(text, 0);
+ // helix's tree-sitter objects, from the grammar's textobjects query
+ const object: ?modal.Normal.Object = switch (obj) {
+ 'f' => .function,
+ 't' => .class,
+ 'a' => .parameter,
+ 'c' => .comment,
+ 'T' => .@"test",
+ 'e' => .entry,
+ 'x' => .xml_element,
+ else => null,
+ };
+ if (object) |o| {
+ if (t.what != .body) return;
+ const pane = t.pane() orelse return;
+ const f = if (pane.file) |*file| file else return;
+ const tree = normal.fileTree(p, f) orelse return;
+ const s = syntax.objectAt(f.path, tree, text, o, around, modal.selectionCursor(text, range)) orelse return;
+ return t.setRange(text, 0, .{ .anchor = s.from, .head = s.to }, false);
+ }
switch (obj) {
'w', 'W' => {
const r = modal.selectWord(text, range, around, obj == 'W');