Show feedback to user when trying to quit with dirty buffers
This commit is contained in:
parent
552417091d
commit
d3e601e774
4 changed files with 58 additions and 13 deletions
|
@ -134,6 +134,19 @@ pub fn is_dirty(self: *const Self) bool {
|
|||
return false;
|
||||
}
|
||||
|
||||
pub fn number_of_dirties(self: *const Self) usize {
|
||||
var dirties: usize = 0;
|
||||
var i = self.buffers.iterator();
|
||||
|
||||
while (i.next()) |p| {
|
||||
const buffer = p.value_ptr.*;
|
||||
if (!buffer.is_ephemeral() and buffer.is_dirty()) {
|
||||
dirties += 1;
|
||||
}
|
||||
}
|
||||
return dirties;
|
||||
}
|
||||
|
||||
pub fn is_buffer_dirty(self: *const Self, file_path: []const u8) bool {
|
||||
return if (self.buffers.get(file_path)) |buffer| buffer.is_dirty() else false;
|
||||
}
|
||||
|
@ -181,18 +194,18 @@ pub fn delete_others(self: *Self, protected: *Buffer) void {
|
|||
}
|
||||
|
||||
pub fn close_others(self: *Self, protected: *Buffer) usize {
|
||||
var removed: usize = 0;
|
||||
var remaining: usize = 0;
|
||||
var i = self.buffers.iterator();
|
||||
if (self.is_dirty()) return 0;
|
||||
while (i.next()) |p| {
|
||||
const buffer = p.value_ptr.*;
|
||||
if (buffer != protected) {
|
||||
if (self.buffers.remove(buffer.get_file_path()))
|
||||
removed += 1;
|
||||
buffer.deinit();
|
||||
if (buffer.is_ephemeral() or !buffer.is_dirty()) {
|
||||
_ = self.buffers.remove(buffer.get_file_path());
|
||||
buffer.deinit();
|
||||
} else remaining += 1;
|
||||
}
|
||||
}
|
||||
return removed;
|
||||
return remaining;
|
||||
}
|
||||
|
||||
pub fn buffer_from_ref(self: *Self, buffer_ref: usize) ?*Buffer {
|
||||
|
|
|
@ -273,7 +273,13 @@ const cmds = struct {
|
|||
const Result = command.Result;
|
||||
|
||||
pub fn quit(self: *Self, _: Ctx) Result {
|
||||
try self.check_all_not_dirty();
|
||||
const logger = log.logger("buffer");
|
||||
defer logger.deinit();
|
||||
self.check_all_not_dirty() catch |err| {
|
||||
const dirties = self.buffer_manager.number_of_dirties();
|
||||
logger.print("There are {} unsaved buffer(s), use 'quit without saving' if not needed to save them", .{dirties});
|
||||
return err;
|
||||
};
|
||||
try tp.self_pid().send("quit");
|
||||
}
|
||||
pub const quit_meta: Meta = .{ .description = "Quit" };
|
||||
|
|
|
@ -163,9 +163,16 @@ const cmds_ = struct {
|
|||
pub const @"bco!_meta": Meta = .{ .description = "bco! (Close other buffers/tabs forcefully, ignoring changes)" };
|
||||
|
||||
pub fn bco(_: *void, _: Ctx) Result {
|
||||
const logger = log.logger("helix-mode");
|
||||
defer logger.deinit();
|
||||
const mv = tui.mainview() orelse return;
|
||||
const bm = tui.get_buffer_manager() orelse return;
|
||||
if (mv.get_active_buffer()) |buffer| _ = bm.close_others(buffer);
|
||||
if (mv.get_active_buffer()) |buffer| {
|
||||
const remaining = bm.close_others(buffer);
|
||||
if (remaining > 0) {
|
||||
logger.print("{} unsaved buffer(s) remaining", .{remaining});
|
||||
}
|
||||
}
|
||||
}
|
||||
pub const bco_meta: Meta = .{ .description = "bco (Close other buffers/tabs, except this one)" };
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue