Compare commits
5 commits
d3ae5e0e09
...
bfefe2f99d
| Author | SHA1 | Date | |
|---|---|---|---|
| bfefe2f99d | |||
| 29e8b4293d | |||
| 725a66e4e2 | |||
| 69fec437f1 | |||
| 5dbd396365 |
1 changed files with 50 additions and 10 deletions
|
|
@ -460,6 +460,7 @@ const cmds = struct {
|
||||||
{
|
{
|
||||||
self.closing_project = true;
|
self.closing_project = true;
|
||||||
defer self.closing_project = false;
|
defer self.closing_project = false;
|
||||||
|
try close_splits(self, .{});
|
||||||
try self.close_all_editors();
|
try self.close_all_editors();
|
||||||
self.delete_all_buffers();
|
self.delete_all_buffers();
|
||||||
self.clear_find_in_files_results(.diagnostics);
|
self.clear_find_in_files_results(.diagnostics);
|
||||||
|
|
@ -936,10 +937,30 @@ const cmds = struct {
|
||||||
pub fn close_split(self: *Self, _: Ctx) Result {
|
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)
|
if (self.views.widgets.items.len == 1 and self.views.widgets.items[0].widget.dynamic_cast(home) != null)
|
||||||
return command.executeName("quit", .{});
|
return command.executeName("quit", .{});
|
||||||
return self.remove_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);
|
||||||
}
|
}
|
||||||
pub const close_split_meta: Meta = .{ .description = "Close split view" };
|
pub const close_split_meta: Meta = .{ .description = "Close split view" };
|
||||||
|
|
||||||
|
pub fn close_splits(self: *Self, _: Ctx) Result {
|
||||||
|
while (self.views.widgets.items.len > 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);
|
||||||
|
}
|
||||||
|
pub const close_splits_meta: Meta = .{ .description = "Close all split views" };
|
||||||
|
|
||||||
pub fn focus_split(self: *Self, ctx: Ctx) Result {
|
pub fn focus_split(self: *Self, ctx: Ctx) Result {
|
||||||
var n: usize = undefined;
|
var n: usize = undefined;
|
||||||
if (!try ctx.args.match(.{tp.extract(&n)})) return error.InvalidFocusSplitArgument;
|
if (!try ctx.args.match(.{tp.extract(&n)})) return error.InvalidFocusSplitArgument;
|
||||||
|
|
@ -1484,7 +1505,7 @@ pub fn handle_editor_event(self: *Self, editor: *ed.Editor, m: tp.message) tp.re
|
||||||
|
|
||||||
if (try m.match(.{ "E", "close" })) {
|
if (try m.match(.{ "E", "close" })) {
|
||||||
if (!self.closing_project) {
|
if (!self.closing_project) {
|
||||||
if (self.get_next_mru_buffer_same_view_only(.non_hidden)) |file_path|
|
if (self.get_next_mru_buffer_for_view(self.active_view, .non_hidden)) |file_path|
|
||||||
self.show_file_async(file_path)
|
self.show_file_async(file_path)
|
||||||
else {
|
else {
|
||||||
if (self.views.widgets.items.len == 1)
|
if (self.views.widgets.items.len == 1)
|
||||||
|
|
@ -1629,6 +1650,12 @@ pub fn get_view_for_file(self: *Self, file_path: []const u8) ?usize {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_file_for_view(self: *Self, view_: usize) ?[]const u8 {
|
||||||
|
const view = self.views.get_at(view_) orelse return null;
|
||||||
|
const editor = view.get("editor") orelse return null;
|
||||||
|
return if (editor.dynamic_cast(ed.EditorWidget)) |p| p.editor.file_path else null;
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_active_file_path(self: *Self) ?[]const u8 {
|
pub fn get_active_file_path(self: *Self) ?[]const u8 {
|
||||||
return if (self.get_active_editor()) |editor| editor.file_path orelse null else null;
|
return if (self.get_active_editor()) |editor| editor.file_path orelse null else null;
|
||||||
}
|
}
|
||||||
|
|
@ -1693,15 +1720,20 @@ pub fn focus_view(self: *Self, n: usize) !void {
|
||||||
if (self.views.get_at(self.active_view)) |view| view.focus();
|
if (self.views.get_at(self.active_view)) |view| view.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn remove_active_view(self: *Self) !void {
|
fn remove_view(self: *Self, view: usize) !void {
|
||||||
if (self.views.widgets.items.len == 1) return; // can't delete last view
|
if (self.views.widgets.items.len == 1) return; // can't delete last view
|
||||||
self.views.delete(self.active_view);
|
if (view >= self.views.widgets.items.len) return;
|
||||||
|
self.views.delete(view);
|
||||||
if (self.active_view >= self.views.widgets.items.len)
|
if (self.active_view >= self.views.widgets.items.len)
|
||||||
self.active_view = self.views.widgets.items.len - 1;
|
self.active_view = self.views.widgets.items.len - 1;
|
||||||
if (self.views.get_at(self.active_view)) |view| view.focus();
|
if (self.views.get_at(self.active_view)) |active_view| active_view.focus();
|
||||||
tui.resize();
|
tui.resize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn remove_active_view(self: *Self) !void {
|
||||||
|
return self.remove_view(self.active_view);
|
||||||
|
}
|
||||||
|
|
||||||
fn replace_active_view(self: *Self, widget: Widget) !void {
|
fn replace_active_view(self: *Self, widget: Widget) !void {
|
||||||
const n = self.active_view;
|
const n = self.active_view;
|
||||||
if (self.views.get_at(n)) |view| view.unfocus();
|
if (self.views.get_at(n)) |view| view.unfocus();
|
||||||
|
|
@ -1905,7 +1937,15 @@ fn extract_state(self: *Self, iter: *[]const u8, mode: enum { no_project, with_p
|
||||||
for (buffers) |buffer| if (!buffer.is_ephemeral())
|
for (buffers) |buffer| if (!buffer.is_ephemeral())
|
||||||
send_buffer_did_open(self.allocator, buffer) catch {};
|
send_buffer_did_open(self.allocator, buffer) catch {};
|
||||||
|
|
||||||
if (editor_file_path) |file_path|
|
var max_last_view: usize = 0;
|
||||||
|
for (buffers) |buffer| if (buffer.get_last_view()) |view| {
|
||||||
|
max_last_view = @max(max_last_view, view);
|
||||||
|
};
|
||||||
|
|
||||||
|
for (0..max_last_view + 1) |view| {
|
||||||
|
if (self.get_next_mru_buffer_for_view(view, .non_hidden)) |file_path|
|
||||||
|
self.show_file_async(file_path);
|
||||||
|
} else if (editor_file_path) |file_path|
|
||||||
if (self.buffer_manager.get_buffer_for_file(file_path)) |_|
|
if (self.buffer_manager.get_buffer_for_file(file_path)) |_|
|
||||||
try tp.self_pid().send(.{ "cmd", "navigate", .{ .file = file_path } });
|
try tp.self_pid().send(.{ "cmd", "navigate", .{ .file = file_path } });
|
||||||
}
|
}
|
||||||
|
|
@ -1927,19 +1967,19 @@ fn send_buffer_did_open(allocator: std.mem.Allocator, buffer: *Buffer) !void {
|
||||||
project_manager.request_vcs_id(buffer.get_file_path()) catch {};
|
project_manager.request_vcs_id(buffer.get_file_path()) catch {};
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_next_mru_buffer_same_view_only(self: *Self, mode: enum { all, hidden, non_hidden }) ?[]const u8 {
|
fn get_next_mru_buffer_for_view(self: *Self, view: usize, 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 file_path = self.get_file_for_view(view);
|
||||||
for (buffers) |buffer| {
|
for (buffers) |buffer| {
|
||||||
if (active_file_path) |fp| if (std.mem.eql(u8, fp, buffer.get_file_path()))
|
if (file_path) |fp| if (std.mem.eql(u8, fp, buffer.get_file_path()))
|
||||||
continue;
|
continue;
|
||||||
if (switch (mode) {
|
if (switch (mode) {
|
||||||
.all => false,
|
.all => false,
|
||||||
.hidden => !buffer.hidden,
|
.hidden => !buffer.hidden,
|
||||||
.non_hidden => buffer.hidden,
|
.non_hidden => buffer.hidden,
|
||||||
}) continue;
|
}) continue;
|
||||||
if (buffer.get_last_view() != self.active_view)
|
if (buffer.get_last_view() != view)
|
||||||
continue;
|
continue;
|
||||||
return buffer.get_file_path();
|
return buffer.get_file_path();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue