feat: add path segment completion to open_recent palette

This commit is contained in:
CJ van den Berg 2025-11-11 13:26:48 +01:00
parent 407d5fa888
commit e6f0953732
Signed by: neurocyte
GPG key ID: 8EB1E1BB660E3FB9
2 changed files with 22 additions and 1 deletions

View file

@ -424,7 +424,7 @@
["kp_end", "palette_menu_bottom"], ["kp_end", "palette_menu_bottom"],
["enter", "palette_menu_activate"], ["enter", "palette_menu_activate"],
["shift+enter", "palette_menu_activate_alternate"], ["shift+enter", "palette_menu_activate_alternate"],
["tab", "palette_menu_activate"], ["tab", "palette_menu_complete"],
["delete", "palette_menu_delete_item"], ["delete", "palette_menu_delete_item"],
["backspace", "overlay_delete_backwards"] ["backspace", "overlay_delete_backwards"]
], ],

View file

@ -245,6 +245,22 @@ fn start_query(self: *Self) MessageFilter.Error!void {
try project_manager.query_recent_files(max_recent_files, self.inputbox.text.items); try project_manager.query_recent_files(max_recent_files, self.inputbox.text.items);
} }
fn complete(self: *Self) !void {
const pos = self.inputbox.text.items.len;
const btn = self.menu.get_selected() orelse return;
var iter = btn.opts.label;
var file_path: []const u8 = undefined;
if (!(cbor.matchString(&iter, &file_path) catch false)) return;
if (std.mem.indexOfPos(u8, file_path, pos, &.{std.fs.path.sep})) |pos_| {
self.inputbox.text.shrinkRetainingCapacity(0);
try self.inputbox.text.appendSlice(self.allocator, file_path[0..@min(pos_ + 1, file_path.len)]);
}
self.inputbox.cursor = tui.egc_chunk_width(self.inputbox.text.items, 0, 8);
return self.start_query();
}
fn delete_word(self: *Self) !void { fn delete_word(self: *Self) !void {
if (std.mem.lastIndexOfAny(u8, self.inputbox.text.items, "/\\. -_")) |pos| { if (std.mem.lastIndexOfAny(u8, self.inputbox.text.items, "/\\. -_")) |pos| {
self.inputbox.text.shrinkRetainingCapacity(pos); self.inputbox.text.shrinkRetainingCapacity(pos);
@ -326,6 +342,11 @@ const cmds = struct {
} }
pub const palette_menu_top_meta: Meta = .{}; pub const palette_menu_top_meta: Meta = .{};
pub fn palette_menu_complete(self: *Self, _: Ctx) Result {
try self.complete();
}
pub const palette_menu_complete_meta: Meta = .{};
pub fn palette_menu_activate(self: *Self, _: Ctx) Result { pub fn palette_menu_activate(self: *Self, _: Ctx) Result {
self.menu.activate_selected(); self.menu.activate_selected();
} }