summaryrefslogtreecommitdiff
path: root/src/normal.zig
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-09-28 16:41:37 -0300
committerGabriel Schneider <[email protected]>2026-10-01 00:12:15 -0300
commit78daa25e5c99cc0d71da36b6e0dcdd362b0cb284 (patch)
treefd98816559ccd4f4a54b1993a7defa39a4f7fda2 /src/normal.zig
parent686673bfb67ac80ed464351528d9ab1bceaa1d02 (diff)
downloadpardes-78daa25e5c99cc0d71da36b6e0dcdd362b0cb284.tar.gz
pardes-78daa25e5c99cc0d71da36b6e0dcdd362b0cb284.zip
Tab after text leaves the syntax node in insert mode; Shift-Tab indents
helix smart_tab: in insert mode, Tab where text precedes the cursor on its line moves past the end of the node the cursor is in, the parent-node end of Alt-e; in leading blanks it indents. Only where the file has a grammar: the reference pins smart tab off, which a file without a grammar agrees with, so there Tab still indents. Shift-Tab is insert_tab, and the differential harness now reads the S- modifier. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Diffstat (limited to 'src/normal.zig')
-rw-r--r--src/normal.zig6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/normal.zig b/src/normal.zig
index 228c9c39..f9d7cf25 100644
--- a/src/normal.zig
+++ b/src/normal.zig
@@ -171,7 +171,7 @@ pub fn applySelRegex(p: *Pardes, pane: *Pane, t: *Text, pat: []const u8, mode: m
/// which is made on the first of these keys after an edit and kept, never
/// made again for a key that changed nothing. A range the tree has nothing
/// to say about stays as it was; a text without a grammar, all of them.
-fn nodeSelect(p: *Pardes, pane: *Pane, t: *Text, walk: modal.Normal.NodeWalk) void {
+pub fn nodeSelect(p: *Pardes, pane: *Pane, t: *Text, walk: modal.Normal.NodeWalk) void {
if (t.what != .body) return;
const f = if (pane.file) |*file| file else return;
if (f.node_tree == null or f.node_tree_revision != f.revision) {
@@ -945,6 +945,8 @@ test "tree-sitter selection keys do in a JSON file what hx 25.07.1 does" {
.{ .keys = "6lx\x1bid", .want = "\n" },
.{ .keys = "10l\x1beiX\x1b", .want = "{\"a\": [1, 2X, 3], \"b\": true}\n" },
.{ .keys = "10l\x1bb\x1bbiX\x1b", .want = "{X\"a\": [1, 2, 3], \"b\": true}\n" },
+ // insert Tab after text leaves the node (smart tab)
+ .{ .keys = "8li\tX\x1b", .want = "{\"a\": [1, 2, 3]X, \"b\": true}\n" },
}) |c| {
const pane = try p.setTestFile(text);
p.gpa.free(pane.file.?.path);
@@ -959,6 +961,8 @@ test "tree-sitter selection keys do in a JSON file what hx 25.07.1 does" {
p.update(.{ .key = if (k == '>') .{ .cp = Key.right, .alt = true } else .{ .cp = k, .alt = true } });
} else if (ch == 0x1b) {
p.update(.{ .key = .{ .cp = Key.escape } });
+ } else if (ch == '\t') {
+ p.update(.{ .key = .{ .cp = Key.tab } });
} else p.update(.{ .key = .{ .cp = ch, .text = c.keys[i..][0..1] } });
while (p.nextEffect()) |_| {}
}