From 0910900a9f26a85dc3dfd20d01dc14b4492bf14e Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Fri, 10 Oct 2025 11:59:02 +0200 Subject: [PATCH 1/3] feat: add dump_document_tree command --- src/tui/editor.zig | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/tui/editor.zig b/src/tui/editor.zig index 211e62a..cff09a6 100644 --- a/src/tui/editor.zig +++ b/src/tui/editor.zig @@ -4863,6 +4863,51 @@ pub const Editor = struct { } pub const dump_current_line_tree_meta: Meta = .{ .description = "Debug: dump current line (tree)" }; + pub fn dump_document_tree(self: *Self, _: Context) Result { + const syn = self.syntax orelse return error.Stop; + const tree = syn.tree orelse return error.Stop; + const ast_ = tree.getRootNode().asSExpressionString(); + defer syntax.Node.freeSExpressionString(ast_); + var scratch_name: std.Io.Writer.Allocating = .init(self.allocator); + defer scratch_name.deinit(); + + var ast: std.Io.Writer.Allocating = .init(self.allocator); + defer ast.deinit(); + var iter = ast_; + var indt: usize = 0; + while (iter.len > 0) : (iter = iter[1..]) { + const char = iter[0]; + switch (char) { + '(' => { + if (indt > 0) { + try ast.writer.writeByte('\n'); + for (0..indt) |_| try ast.writer.writeAll(" "); + } + indt += 1; + try ast.writer.writeByte(char); + }, + ')' => { + indt -= 1; + try ast.writer.writeByte(char); + }, + ' ' => { + if (iter.len > 1 and iter[1] == '(') + continue; + try ast.writer.writeByte(char); + }, + else => try ast.writer.writeByte(char), + } + } + + try if (self.file_path) |file_path| + scratch_name.writer.print("*ast: {s}*", .{file_path}) + else + scratch_name.writer.print("*ast*", .{}); + try command.executeName("open_scratch_buffer", command.fmt(.{ scratch_name.written(), ast.written(), "scheme" })); + tp.self_pid().send(.{ "cmd", "navigate", .{ .file = scratch_name.written() } }) catch return; + } + pub const dump_document_tree_meta: Meta = .{ .description = "Debug: dump current document tree" }; + pub fn undo(self: *Self, _: Context) Result { try self.restore_undo(); self.clamp(); From 42705867f1c65d3e8fa35768b6085c5e8338cad5 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Fri, 10 Oct 2025 12:33:30 +0200 Subject: [PATCH 2/3] fix: set ast dump file type asyncronosly to avoid tree-sitter slowdown --- src/tui/editor.zig | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tui/editor.zig b/src/tui/editor.zig index cff09a6..617a4ff 100644 --- a/src/tui/editor.zig +++ b/src/tui/editor.zig @@ -4903,8 +4903,9 @@ pub const Editor = struct { scratch_name.writer.print("*ast: {s}*", .{file_path}) else scratch_name.writer.print("*ast*", .{}); - try command.executeName("open_scratch_buffer", command.fmt(.{ scratch_name.written(), ast.written(), "scheme" })); + try command.executeName("open_scratch_buffer", command.fmt(.{ scratch_name.written(), ast.written(), "text" })); tp.self_pid().send(.{ "cmd", "navigate", .{ .file = scratch_name.written() } }) catch return; + tp.self_pid().send(.{ "cmd", "set_file_type", .{"scheme"} }) catch return; } pub const dump_document_tree_meta: Meta = .{ .description = "Debug: dump current document tree" }; From b463622f059836dd02d8fab6d88db63263918c55 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Fri, 10 Oct 2025 12:34:00 +0200 Subject: [PATCH 3/3] fix: allow Buffer.Manager.delete_buffer calls on dead buffers --- src/buffer/Manager.zig | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/buffer/Manager.zig b/src/buffer/Manager.zig index 3594e69..6cb1d99 100644 --- a/src/buffer/Manager.zig +++ b/src/buffer/Manager.zig @@ -32,7 +32,8 @@ fn add_buffer(self: *Self, buffer: *Buffer) error{OutOfMemory}!void { try self.buffers.put(self.allocator, try self.allocator.dupe(u8, buffer.get_file_path()), buffer); } -pub fn delete_buffer(self: *Self, buffer: *Buffer) void { +pub fn delete_buffer(self: *Self, buffer_: *Buffer) void { + const buffer = self.buffer_from_ref(self.buffer_to_ref(buffer_)) orelse return; // check buffer is valid if (self.buffers.fetchRemove(buffer.get_file_path())) |kv| { self.allocator.free(kv.key); kv.value.deinit();