feat: allow open_previous_file to jump back to a closed tab

This commit is contained in:
CJ van den Berg 2025-11-04 12:27:34 +01:00
parent eb72f06be1
commit b116d10348
Signed by: neurocyte
GPG key ID: 8EB1E1BB660E3FB9

View file

@ -1002,7 +1002,7 @@ const cmds = struct {
pub const show_diagnostics_meta: Meta = .{ .description = "Show diagnostics panel" }; pub const show_diagnostics_meta: Meta = .{ .description = "Show diagnostics panel" };
pub fn open_previous_file(self: *Self, _: Ctx) Result { pub fn open_previous_file(self: *Self, _: Ctx) Result {
self.show_file_async(self.get_next_mru_buffer() orelse return error.Stop); self.show_file_async(self.get_next_mru_buffer(.all) orelse return error.Stop);
} }
pub const open_previous_file_meta: Meta = .{ .description = "Open the previous file" }; pub const open_previous_file_meta: Meta = .{ .description = "Open the previous file" };
@ -1228,7 +1228,7 @@ pub fn handle_editor_event(self: *Self, _: tp.pid_ref, m: tp.message) tp.result
return self.location_update(m); return self.location_update(m);
if (try m.match(.{ "E", "close" })) { if (try m.match(.{ "E", "close" })) {
if (self.get_next_mru_buffer()) |file_path| if (self.get_next_mru_buffer(.non_hidden)) |file_path|
self.show_file_async(file_path) self.show_file_async(file_path)
else else
self.show_home_async(); self.show_home_async();
@ -1498,15 +1498,18 @@ fn send_buffer_did_open(allocator: std.mem.Allocator, buffer: *Buffer) !void {
); );
} }
fn get_next_mru_buffer(self: *Self) ?[]const u8 { fn get_next_mru_buffer(self: *Self, mode: enum { all, hidden, non_hidden }) ?[]const u8 {
const buffers = self.buffer_manager.list_most_recently_used(self.allocator) catch return null; const buffers = self.buffer_manager.list_most_recently_used(self.allocator) catch return null;
defer self.allocator.free(buffers); defer self.allocator.free(buffers);
const active_file_path = self.get_active_file_path(); const active_file_path = self.get_active_file_path();
for (buffers) |buffer| { for (buffers) |buffer| {
if (active_file_path) |fp| if (std.mem.eql(u8, fp, buffer.get_file_path())) if (active_file_path) |fp| if (std.mem.eql(u8, fp, buffer.get_file_path()))
continue; continue;
if (buffer.hidden) if (switch (mode) {
continue; .all => false,
.hidden => !buffer.hidden,
.non_hidden => buffer.hidden,
}) continue;
return buffer.get_file_path(); return buffer.get_file_path();
} }
return null; return null;