From 7c354c994ffad523f02fb4d961ea5092cffff883 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Fri, 21 Feb 2025 21:38:25 +0100 Subject: [PATCH 1/3] feat: improve shell_execute_stream_output to follow output tail only if cursor is at buffer end --- src/tui/editor.zig | 14 ++++++++++++++ src/tui/mainview.zig | 3 +-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/tui/editor.zig b/src/tui/editor.zig index 158c9d5..6fbad3b 100644 --- a/src/tui/editor.zig +++ b/src/tui/editor.zig @@ -3993,6 +3993,20 @@ pub const Editor = struct { } pub const smart_insert_line_after_meta = .{ .description = "Insert line after (smart)" }; + pub fn smart_buffer_append(self: *Self, ctx: Context) Result { + var chars: []const u8 = undefined; + if (!try ctx.args.match(.{tp.extract(&chars)})) + return error.InvalidInsertCharsArgument; + const b = try self.buf_for_update(); + var root = b.root; + var cursel: CurSel = .{}; + cursel.cursor.move_buffer_end(root, self.metrics); + root = try self.insert(root, &cursel, chars, b.allocator); + try self.update_buf(root); + self.clamp(); + } + pub const smart_buffer_append_meta = .{ .arguments = &.{.string} }; + pub fn enable_fast_scroll(self: *Self, _: Context) Result { self.fast_scroll = true; } diff --git a/src/tui/mainview.zig b/src/tui/mainview.zig index 98795f6..0bce784 100644 --- a/src/tui/mainview.zig +++ b/src/tui/mainview.zig @@ -847,8 +847,7 @@ const cmds = struct { return error.InvalidShellOutputArgument; const buffer = self.buffer_manager.buffer_from_ref(buffer_ref) orelse return; if (self.get_active_editor()) |editor| if (editor.buffer) |eb| if (eb == buffer) { - editor.move_buffer_end(.{}) catch {}; - editor.insert_chars(command.fmt(.{output})) catch {}; + editor.smart_buffer_append(command.fmt(.{output})) catch {}; tui.need_render(); return; }; From a288945609df08b6efefd980936ee3826c9575dc Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Fri, 21 Feb 2025 21:39:06 +0100 Subject: [PATCH 2/3] feat: toggle gutter symbols along with inline diagnostics --- src/tui/editor_gutter.zig | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tui/editor_gutter.zig b/src/tui/editor_gutter.zig index 21297c0..9e80dbc 100644 --- a/src/tui/editor_gutter.zig +++ b/src/tui/editor_gutter.zig @@ -265,7 +265,8 @@ inline fn render_diff_symbols(self: *Self, diff_symbols: *[]Symbol, pos: usize, } fn render_diagnostics(self: *Self, theme: *const Widget.Theme) void { - for (self.editor.diagnostics.items) |*diag| self.render_diagnostic(diag, theme); + if (tui.config().inline_diagnostics) + for (self.editor.diagnostics.items) |*diag| self.render_diagnostic(diag, theme); } fn render_diagnostic(self: *Self, diag: *const ed.Diagnostic, theme: *const Widget.Theme) void { From a0514a6f7e785df0eb41a268bf2ba38013dbc22a Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Fri, 21 Feb 2025 22:17:28 +0100 Subject: [PATCH 3/3] build: update to zig-0.14.0-dev.3280 --- build.zig.version | 2 +- src/location_history.zig | 8 ++++---- src/project_manager.zig | 18 ++++++++++-------- src/tui/WidgetList.zig | 2 +- src/tui/editor.zig | 2 +- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/build.zig.version b/build.zig.version index a3c5b4e..aa57b2f 100644 --- a/build.zig.version +++ b/build.zig.version @@ -1 +1 @@ -0.14.0-dev.3091+42e48b83b +0.14.0-dev.3280+bbd13ab96 diff --git a/src/location_history.zig b/src/location_history.zig index c64c43f..98d5864 100644 --- a/src/location_history.zig +++ b/src/location_history.zig @@ -123,13 +123,13 @@ const Process = struct { if (isdupe(self.backwards.getLastOrNull(), entry)) { if (self.current) |current| self.forwards.append(current) catch {}; - const top = self.backwards.pop(); - self.allocator.free(top.file_path); + if (self.backwards.pop()) |top| + self.allocator.free(top.file_path); tp.trace(tp.channel.all, tp.message.fmt(.{ "location", "back", entry.file_path, entry.cursor.row, entry.cursor.col, self.backwards.items.len, self.forwards.items.len })); } else if (isdupe(self.forwards.getLastOrNull(), entry)) { if (self.current) |current| self.backwards.append(current) catch {}; - const top = self.forwards.pop(); - self.allocator.free(top.file_path); + if (self.forwards.pop()) |top| + self.allocator.free(top.file_path); tp.trace(tp.channel.all, tp.message.fmt(.{ "location", "forward", entry.file_path, entry.cursor.row, entry.cursor.col, self.backwards.items.len, self.forwards.items.len })); } else if (self.current) |current| { try self.backwards.append(current); diff --git a/src/project_manager.zig b/src/project_manager.zig index b749397..caa62ef 100644 --- a/src/project_manager.zig +++ b/src/project_manager.zig @@ -913,10 +913,11 @@ const FilteredWalker = struct { var containing = top; var dirname_len = top.dirname_len; if (top.iter.next() catch { - var item = self.stack.pop(); - if (self.stack.items.len != 0) { - item.iter.dir.close(); - } + var item_ = self.stack.pop(); + if (item_) |*item| + if (self.stack.items.len != 0) { + item.iter.dir.close(); + }; continue; }) |base| { self.name_buffer.shrinkRetainingCapacity(dirname_len); @@ -947,10 +948,11 @@ const FilteredWalker = struct { else => continue, } } else { - var item = self.stack.pop(); - if (self.stack.items.len != 0) { - item.iter.dir.close(); - } + var item_ = self.stack.pop(); + if (item_) |*item| + if (self.stack.items.len != 0) { + item.iter.dir.close(); + }; } } return null; diff --git a/src/tui/WidgetList.zig b/src/tui/WidgetList.zig index 81ccaa3..3e3274a 100644 --- a/src/tui/WidgetList.zig +++ b/src/tui/WidgetList.zig @@ -104,7 +104,7 @@ pub fn remove_all(self: *Self) void { } pub fn pop(self: *Self) ?Widget { - return if (self.widgets.popOrNull()) |ws| ws.widget else null; + return if (self.widgets.pop()) |ws| ws.widget else null; } pub fn empty(self: *const Self) bool { diff --git a/src/tui/editor.zig b/src/tui/editor.zig index fb99b89..1cba0e1 100644 --- a/src/tui/editor.zig +++ b/src/tui/editor.zig @@ -629,7 +629,7 @@ pub const Editor = struct { pub fn pop_cursor(self: *Self, _: Context) Result { if (self.cursels.items.len > 1) { - const cursel = self.cursels.popOrNull() orelse return orelse return; + const cursel = self.cursels.pop() orelse return orelse return; if (cursel.selection) |sel| if (self.find_selection_match(sel)) |match| { match.has_selection = false; };