feat: add keybindings for next/previous file in filelist_view (A-n/p)
This commit is contained in:
parent
99b50dd3f5
commit
9a6c5baf8b
6 changed files with 52 additions and 21 deletions
|
@ -6,11 +6,12 @@ const cbor = @import("cbor");
|
||||||
const Allocator = @import("std").mem.Allocator;
|
const Allocator = @import("std").mem.Allocator;
|
||||||
const Mutex = @import("std").Thread.Mutex;
|
const Mutex = @import("std").Thread.Mutex;
|
||||||
const ArrayList = @import("std").ArrayList;
|
const ArrayList = @import("std").ArrayList;
|
||||||
const Plane = @import("renderer").Plane;
|
|
||||||
|
|
||||||
|
const Plane = @import("renderer").Plane;
|
||||||
const tp = @import("thespian");
|
const tp = @import("thespian");
|
||||||
const log = @import("log");
|
const log = @import("log");
|
||||||
|
|
||||||
|
const command = @import("command.zig");
|
||||||
const tui = @import("tui.zig");
|
const tui = @import("tui.zig");
|
||||||
const Widget = @import("Widget.zig");
|
const Widget = @import("Widget.zig");
|
||||||
const MessageFilter = @import("MessageFilter.zig");
|
const MessageFilter = @import("MessageFilter.zig");
|
||||||
|
@ -23,11 +24,13 @@ const escape = fmt.fmtSliceEscapeLower;
|
||||||
pub const name = @typeName(Self);
|
pub const name = @typeName(Self);
|
||||||
|
|
||||||
const Self = @This();
|
const Self = @This();
|
||||||
|
const Commands = command.Collection(cmds);
|
||||||
|
|
||||||
allocator: std.mem.Allocator,
|
allocator: std.mem.Allocator,
|
||||||
plane: Plane,
|
plane: Plane,
|
||||||
menu: *Menu.State(*Self),
|
menu: *Menu.State(*Self),
|
||||||
logger: log.Logger,
|
logger: log.Logger,
|
||||||
|
commands: Commands = undefined,
|
||||||
|
|
||||||
items: usize = 0,
|
items: usize = 0,
|
||||||
view_pos: usize = 0,
|
view_pos: usize = 0,
|
||||||
|
@ -53,15 +56,16 @@ pub fn create(allocator: Allocator, parent: Plane) !Widget {
|
||||||
.menu = try Menu.create(*Self, allocator, tui.current().mainview, .{
|
.menu = try Menu.create(*Self, allocator, tui.current().mainview, .{
|
||||||
.ctx = self,
|
.ctx = self,
|
||||||
.on_render = handle_render_menu,
|
.on_render = handle_render_menu,
|
||||||
// .on_resize = on_resize_menu,
|
|
||||||
.on_scroll = EventHandler.bind(self, Self.handle_scroll),
|
.on_scroll = EventHandler.bind(self, Self.handle_scroll),
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
|
try self.commands.init(self);
|
||||||
return Widget.to(self);
|
return Widget.to(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn deinit(self: *Self, a: Allocator) void {
|
pub fn deinit(self: *Self, a: Allocator) void {
|
||||||
self.plane.deinit();
|
self.plane.deinit();
|
||||||
|
self.commands.deinit();
|
||||||
a.destroy(self);
|
a.destroy(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,3 +173,19 @@ fn handle_menu_action(menu: **Menu.State(*Self), button: *Button.State(*Menu.Sta
|
||||||
},
|
},
|
||||||
} }) catch |e| self.logger.err("navigate", e);
|
} }) catch |e| self.logger.err("navigate", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const cmds = struct {
|
||||||
|
pub const Target = Self;
|
||||||
|
const Ctx = command.Context;
|
||||||
|
const Result = command.Result;
|
||||||
|
|
||||||
|
pub fn goto_prev_file(self: *Self, _: Ctx) Result {
|
||||||
|
self.menu.select_up();
|
||||||
|
self.menu.activate_selected();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn goto_next_file(self: *Self, _: Ctx) Result {
|
||||||
|
self.menu.select_down();
|
||||||
|
self.menu.activate_selected();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
|
@ -110,14 +110,7 @@ fn add_find_in_files_result(self: *Self, path: []const u8, begin_line: usize, be
|
||||||
self.find_in_files_done = false;
|
self.find_in_files_done = false;
|
||||||
fl.reset();
|
fl.reset();
|
||||||
}
|
}
|
||||||
fl.add_item(.{
|
fl.add_item(.{ .path = path, .begin_line = begin_line - 1, .begin_pos = begin_pos - 1, .end_line = end_line - 1, .end_pos = end_pos - 1, .lines = lines }) catch |e| return tp.exit_error(e, @errorReturnTrace());
|
||||||
.path = path,
|
|
||||||
.begin_line = begin_line - 1,
|
|
||||||
.begin_pos = begin_pos - 1,
|
|
||||||
.end_line = end_line - 1,
|
|
||||||
.end_pos = end_pos - 1,
|
|
||||||
.lines = lines
|
|
||||||
}) catch |e| return tp.exit_error(e, @errorReturnTrace());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update(self: *Self) void {
|
pub fn update(self: *Self) void {
|
||||||
|
@ -376,6 +369,24 @@ const cmds = struct {
|
||||||
gutter.relative = lnr;
|
gutter.relative = lnr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn goto_next_file_or_diagnostic(self: *Self, ctx: Ctx) Result {
|
||||||
|
const filelist_view = @import("filelist_view.zig");
|
||||||
|
if (self.is_panel_view_showing(filelist_view)) {
|
||||||
|
try command.executeName("goto_next_file", ctx);
|
||||||
|
} else {
|
||||||
|
try command.executeName("goto_next_diagnostic", ctx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn goto_prev_file_or_diagnostic(self: *Self, ctx: Ctx) Result {
|
||||||
|
const filelist_view = @import("filelist_view.zig");
|
||||||
|
if (self.is_panel_view_showing(filelist_view)) {
|
||||||
|
try command.executeName("goto_prev_file", ctx);
|
||||||
|
} else {
|
||||||
|
try command.executeName("goto_prev_diagnostic", ctx);
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn handle_editor_event(self: *Self, _: tp.pid_ref, m: tp.message) tp.result {
|
pub fn handle_editor_event(self: *Self, _: tp.pid_ref, m: tp.message) tp.result {
|
||||||
|
|
|
@ -141,8 +141,8 @@ fn mapPress(self: *Self, keypress: u32, egc: u32, modifiers: u32) !void {
|
||||||
},
|
},
|
||||||
mod.ALT => switch (keynormal) {
|
mod.ALT => switch (keynormal) {
|
||||||
'J' => self.cmd("join_next_line", .{}),
|
'J' => self.cmd("join_next_line", .{}),
|
||||||
'N' => self.cmd("goto_next_diagnostic", .{}),
|
'N' => self.cmd("goto_next_file_or_diagnostic", .{}),
|
||||||
'P' => self.cmd("goto_prev_diagnostic", .{}),
|
'P' => self.cmd("goto_prev_file_or_diagnostic", .{}),
|
||||||
'U' => self.cmd("to_upper", .{}),
|
'U' => self.cmd("to_upper", .{}),
|
||||||
'L' => self.cmd("to_lower", .{}),
|
'L' => self.cmd("to_lower", .{}),
|
||||||
'I' => self.cmd("toggle_inputview", .{}),
|
'I' => self.cmd("toggle_inputview", .{}),
|
||||||
|
@ -336,9 +336,9 @@ const hints = tui.KeybindHints.initComptime(.{
|
||||||
// .{ "filter", "S-A-s" }, // self.cmd("filter", command.fmt(.{ "sort", "-u" })),
|
// .{ "filter", "S-A-s" }, // self.cmd("filter", command.fmt(.{ "sort", "-u" })),
|
||||||
.{ "format", "S-A-f" },
|
.{ "format", "S-A-f" },
|
||||||
.{ "goto_definition", "F12" },
|
.{ "goto_definition", "F12" },
|
||||||
.{ "goto_next_diagnostic", "A-n" },
|
.{ "goto_next_file_or_diagnostic", "A-n" },
|
||||||
.{ "goto_next_match", "C-n, F3" },
|
.{ "goto_next_match", "C-n, F3" },
|
||||||
.{ "goto_prev_diagnostic", "A-p" },
|
.{ "goto_prev_file_or_diagnostic", "A-p" },
|
||||||
.{ "goto_prev_match", "C-p, S-F3" },
|
.{ "goto_prev_match", "C-p, S-F3" },
|
||||||
.{ "gutter_mode_next", "A-F10" },
|
.{ "gutter_mode_next", "A-F10" },
|
||||||
.{ "indent", "tab" },
|
.{ "indent", "tab" },
|
||||||
|
|
|
@ -523,9 +523,9 @@ const hints = tui.KeybindHints.initComptime(.{
|
||||||
// .{ "filter", "S-A-s" }, // self.cmd("filter", command.fmt(.{ "sort", "-u" })),
|
// .{ "filter", "S-A-s" }, // self.cmd("filter", command.fmt(.{ "sort", "-u" })),
|
||||||
.{ "format", "S-A-f" },
|
.{ "format", "S-A-f" },
|
||||||
.{ "goto_definition", "F12" },
|
.{ "goto_definition", "F12" },
|
||||||
.{ "goto_next_diagnostic", "A-n" },
|
.{ "goto_next_file_or_diagnostic", "A-n" },
|
||||||
.{ "goto_next_match", "C-n, F3, n" },
|
.{ "goto_next_match", "C-n, F3, n" },
|
||||||
.{ "goto_prev_diagnostic", "A-p" },
|
.{ "goto_prev_file_or_diagnostic", "A-p" },
|
||||||
.{ "goto_prev_match", "C-p, S-F3, N" },
|
.{ "goto_prev_match", "C-p, S-F3, N" },
|
||||||
.{ "gutter_mode_next", "A-F10" },
|
.{ "gutter_mode_next", "A-F10" },
|
||||||
.{ "indent", "tab" },
|
.{ "indent", "tab" },
|
||||||
|
|
|
@ -483,9 +483,9 @@ const hints = tui.KeybindHints.initComptime(.{
|
||||||
// .{ "filter", "S-A-s" }, // self.cmd("filter", command.fmt(.{ "sort", "-u" })),
|
// .{ "filter", "S-A-s" }, // self.cmd("filter", command.fmt(.{ "sort", "-u" })),
|
||||||
.{ "format", "S-A-f" },
|
.{ "format", "S-A-f" },
|
||||||
.{ "goto_definition", "F12" },
|
.{ "goto_definition", "F12" },
|
||||||
.{ "goto_next_diagnostic", "A-n" },
|
.{ "goto_next_file_or_diagnostic", "A-n" },
|
||||||
.{ "goto_next_match", "C-n, F3, n" },
|
.{ "goto_next_match", "C-n, F3, n" },
|
||||||
.{ "goto_prev_diagnostic", "A-p" },
|
.{ "goto_prev_file_or_diagnostic", "A-p" },
|
||||||
.{ "goto_prev_match", "C-p, S-F3, N" },
|
.{ "goto_prev_match", "C-p, S-F3, N" },
|
||||||
.{ "gutter_mode_next", "A-F10" },
|
.{ "gutter_mode_next", "A-F10" },
|
||||||
.{ "indent", "tab" },
|
.{ "indent", "tab" },
|
||||||
|
|
|
@ -108,8 +108,8 @@ fn mapPress(self: *Self, keypress: u32, egc: u32, modifiers: u32) !void {
|
||||||
},
|
},
|
||||||
mod.ALT => switch (keynormal) {
|
mod.ALT => switch (keynormal) {
|
||||||
'V' => self.cmd("system_paste", .{}),
|
'V' => self.cmd("system_paste", .{}),
|
||||||
'N' => self.cmd("goto_next_match", .{}),
|
'N' => self.cmd("goto_next_file", .{}),
|
||||||
'P' => self.cmd("goto_prev_match", .{}),
|
'P' => self.cmd("goto_prev_file", .{}),
|
||||||
else => {},
|
else => {},
|
||||||
},
|
},
|
||||||
mod.ALT | mod.SHIFT => switch (keynormal) {
|
mod.ALT | mod.SHIFT => switch (keynormal) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue