From 30b1329d109b6865be465ceacccb88f29ba35906 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Mon, 3 Nov 2025 22:13:54 +0100 Subject: [PATCH] refactor: move auto_save flag from Editor to Buffer --- src/buffer/Buffer.zig | 15 +++++++++++++++ src/tui/editor.zig | 17 ++++++++--------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/buffer/Buffer.zig b/src/buffer/Buffer.zig index 7fd1584..ff4cfde 100644 --- a/src/buffer/Buffer.zig +++ b/src/buffer/Buffer.zig @@ -42,6 +42,7 @@ last_save_eol_mode: EolMode = .lf, file_utf8_sanitized: bool = false, hidden: bool = false, ephemeral: bool = false, +auto_save: bool = false, meta: ?[]const u8 = null, lsp_version: usize = 1, @@ -1479,6 +1480,18 @@ pub fn mark_not_ephemeral(self: *Self) void { self.ephemeral = false; } +pub fn enable_auto_save(self: *Self) void { + self.auto_save = true; +} + +pub fn disable_auto_save(self: *Self) void { + self.auto_save = false; +} + +pub fn is_auto_save(self: *const Self) bool { + return self.auto_save; +} + pub fn is_dirty(self: *const Self) bool { return if (!self.file_exists) self.root.length() > 0 @@ -1576,6 +1589,7 @@ pub fn write_state(self: *const Self, writer: *std.Io.Writer) error{ Stop, OutOf try cbor.writeValue(writer, self.file_eol_mode); try cbor.writeValue(writer, self.hidden); try cbor.writeValue(writer, self.ephemeral); + try cbor.writeValue(writer, self.auto_save); try cbor.writeValue(writer, dirty); try cbor.writeValue(writer, self.meta); try cbor.writeValue(writer, self.file_type_name); @@ -1597,6 +1611,7 @@ pub fn extract_state(self: *Self, iter: *[]const u8) !void { cbor.extract(&self.file_eol_mode), cbor.extract(&self.hidden), cbor.extract(&self.ephemeral), + cbor.extract(&self.auto_save), cbor.extract(&dirty), cbor.extract(&meta), cbor.extract(&file_type_name), diff --git a/src/tui/editor.zig b/src/tui/editor.zig index 3f9c7b6..580b6a1 100644 --- a/src/tui/editor.zig +++ b/src/tui/editor.zig @@ -383,7 +383,6 @@ pub const Editor = struct { completion_col: usize = 0, completion_is_complete: bool = true, - enable_auto_save: bool, enable_format_on_save: bool, restored_state: bool = false, @@ -411,11 +410,10 @@ pub const Editor = struct { } pub fn write_state(self: *const Self, writer: *std.Io.Writer) !void { - try cbor.writeArrayHeader(writer, 11); + try cbor.writeArrayHeader(writer, 10); try cbor.writeValue(writer, self.file_path orelse ""); try cbor.writeValue(writer, self.last_find_query orelse ""); try cbor.writeValue(writer, self.enable_format_on_save); - try cbor.writeValue(writer, self.enable_auto_save); try cbor.writeValue(writer, self.indent_size); try cbor.writeValue(writer, self.tab_width); try cbor.writeValue(writer, self.indent_mode); @@ -450,7 +448,6 @@ pub const Editor = struct { tp.extract(&file_path), tp.extract(&last_find_query), tp.extract(&self.enable_format_on_save), - tp.extract(&self.enable_auto_save), tp.extract(&self.indent_size), tp.extract(&self.tab_width), tp.extract(&self.indent_mode), @@ -514,7 +511,6 @@ pub const Editor = struct { .animation_lag = get_animation_max_lag(), .animation_frame_rate = frame_rate, .animation_last_time = time.microTimestamp(), - .enable_auto_save = tui.config().enable_auto_save, .enable_format_on_save = tui.config().enable_format_on_save, .enable_terminal_cursor = tui.config().enable_terminal_cursor, .render_whitespace = from_whitespace_mode(tui.config().whitespace_mode), @@ -598,6 +594,7 @@ pub const Editor = struct { defer frame.deinit(); break :blk try self.buffer_manager.open_file(file_path); }; + if (tui.config().enable_auto_save) buffer.enable_auto_save(); return self.open_buffer(file_path, buffer, null); } @@ -689,6 +686,7 @@ pub const Editor = struct { buffer.file_type_icon = fti; buffer.file_type_color = ftc; } + const auto_save = if (self.buffer) |b| b.is_auto_save() else false; if (buffer_meta) |meta| { const frame_ = tracy.initZone(@src(), .{ .name = "extract_state" }); @@ -700,8 +698,9 @@ pub const Editor = struct { } fn maybe_enable_auto_save(self: *Self) void { + const buffer = self.buffer orelse return; if (self.restored_state) return; - self.enable_auto_save = false; + buffer.disable_auto_save(); if (!tui.config().enable_auto_save) return; const self_file_type = self.file_type orelse return; @@ -712,7 +711,7 @@ pub const Editor = struct { break :enable; return; } - self.enable_auto_save = true; + buffer.enable_auto_save(); } fn detect_indent_mode(self: *Self, content: []const u8) void { @@ -1781,7 +1780,7 @@ pub const Editor = struct { _ = try self.handlers.msg(.{ "E", "update", token_from(new_root), token_from(old_root), @intFromEnum(eol_mode) }); if (self.buffer) |buffer| if (self.syntax) |_| if (self.file_path) |file_path| if (old_root != null and new_root != null) project_manager.did_change(file_path, buffer.lsp_version, try text_from_root(new_root, eol_mode), try text_from_root(old_root, eol_mode), eol_mode) catch {}; - if (self.enable_auto_save) + if (self.buffer) |b| if (b.is_auto_save()) tp.self_pid().send(.{ "cmd", "save_file", .{} }) catch {}; } @@ -5005,7 +5004,7 @@ pub const Editor = struct { pub const SaveOption = enum { default, format, no_format }; pub fn toggle_auto_save(self: *Self, _: Context) Result { - self.enable_auto_save = !self.enable_auto_save; + if (self.buffer) |b| if (b.is_auto_save()) b.disable_auto_save() else b.enable_auto_save(); } pub const toggle_auto_save_meta: Meta = .{ .description = "Toggle auto save" };