diff --git a/src/config.zig b/src/config.zig index d26485d..850738d 100644 --- a/src/config.zig +++ b/src/config.zig @@ -21,7 +21,7 @@ inline_diagnostics_alignment: Alignment = .right, animation_min_lag: usize = 0, //milliseconds animation_max_lag: usize = 50, //milliseconds hover_time_ms: usize = 500, //milliseconds -input_idle_time_ms: usize = 100, //milliseconds +input_idle_time_ms: usize = 150, //milliseconds idle_actions: []const IdleAction = &default_actions, idle_commands: ?[]const []const u8 = null, // a list of simple commands enable_format_on_save: bool = false, @@ -77,7 +77,7 @@ dropdown_keybinds: DropdownKeybindMode = .standard, include_files: []const u8 = "", -const default_actions = [_]IdleAction{.highlight_references}; +const default_actions = [_]IdleAction{}; pub const IdleAction = enum { hover, highlight_references, diff --git a/src/tui/mainview.zig b/src/tui/mainview.zig index 732c96c..8653648 100644 --- a/src/tui/mainview.zig +++ b/src/tui/mainview.zig @@ -952,20 +952,48 @@ const cmds = struct { pub fn close_split(self: *Self, _: Ctx) Result { if (self.views.widgets.items.len == 1 and self.views.widgets.items[0].widget.dynamic_cast(home) != null) return command.executeName("quit", .{}); - self.remove_view(self.active_view); + try self.remove_active_view(); + + if (self.closing_project) return; + + const buffers = try self.buffer_manager.list_unordered(self.allocator); + defer self.allocator.free(buffers); + for (buffers) |buffer| if (buffer.get_last_view()) |view| + if (view >= self.views.widgets.items.len) + buffer.set_last_view(null); + + _ = try self.widgets_widget.msg(.{"splits_updated"}); } pub const close_split_meta: Meta = .{ .description = "Close split view" }; pub fn close_view(self: *Self, ctx: Ctx) Result { var view: usize = undefined; if (!try ctx.args.match(.{tp.extract(&view)})) return error.InvalidCloseViewArgument; - self.remove_view(view); + + if (view >= self.views.widgets.items.len) return; + self.remove_view(view) catch return; + + const buffers = self.buffer_manager.list_unordered(self.allocator) catch @panic("OOM close_view"); + defer self.allocator.free(buffers); + for (buffers) |buffer| if (buffer.get_last_view()) |buffer_view| + if (buffer_view >= view) + buffer.set_last_view(buffer_view - 1); + + _ = self.widgets_widget.msg(.{"splits_updated"}) catch {}; } pub const close_view_meta: Meta = .{ .arguments = &.{.integer} }; pub fn close_splits(self: *Self, _: Ctx) Result { while (self.views.widgets.items.len > 1) - self.remove_view(1); + try self.remove_view(1); + + if (self.closing_project) return; + + const buffers = try self.buffer_manager.list_unordered(self.allocator); + defer self.allocator.free(buffers); + for (buffers) |buffer| buffer.set_last_view(0); + + _ = try self.widgets_widget.msg(.{"splits_updated"}); } pub const close_splits_meta: Meta = .{ .description = "Close all split views" }; @@ -1745,24 +1773,18 @@ pub fn focus_view(self: *Self, n: usize) !void { if (self.views.get_at(self.active_view)) |view| view.focus(); } -fn remove_view(self: *Self, view: usize) void { +fn remove_view(self: *Self, view: usize) !void { if (self.views.widgets.items.len == 1) return; // can't delete last view if (view >= self.views.widgets.items.len) return; - defer { - _ = self.widgets_widget.msg(.{"splits_updated"}) catch {}; - tui.resize(); - } self.views.delete(view); if (self.active_view >= self.views.widgets.items.len) self.active_view = self.views.widgets.items.len - 1; if (self.views.get_at(self.active_view)) |active_view| active_view.focus(); + tui.resize(); +} - if (self.closing_project) return; - const buffers = self.buffer_manager.list_unordered(self.allocator) catch @panic("OOM remove_view"); - defer self.allocator.free(buffers); - for (buffers) |buffer| if (buffer.get_last_view()) |buffer_view| - if (buffer_view >= view) - buffer.set_last_view(buffer_view - 1); +fn remove_active_view(self: *Self) !void { + return self.remove_view(self.active_view); } fn replace_active_view(self: *Self, widget: Widget) !void {