From e6f0953732e6efaeca0fca147ae9a8439b5f2f4a Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Tue, 11 Nov 2025 13:26:48 +0100 Subject: [PATCH] feat: add path segment completion to open_recent palette --- src/keybind/builtin/flow.json | 2 +- src/tui/mode/overlay/open_recent.zig | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/keybind/builtin/flow.json b/src/keybind/builtin/flow.json index d2c8440..c608c42 100644 --- a/src/keybind/builtin/flow.json +++ b/src/keybind/builtin/flow.json @@ -424,7 +424,7 @@ ["kp_end", "palette_menu_bottom"], ["enter", "palette_menu_activate"], ["shift+enter", "palette_menu_activate_alternate"], - ["tab", "palette_menu_activate"], + ["tab", "palette_menu_complete"], ["delete", "palette_menu_delete_item"], ["backspace", "overlay_delete_backwards"] ], diff --git a/src/tui/mode/overlay/open_recent.zig b/src/tui/mode/overlay/open_recent.zig index 9ba2e12..7bcc3b4 100644 --- a/src/tui/mode/overlay/open_recent.zig +++ b/src/tui/mode/overlay/open_recent.zig @@ -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); } +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 { if (std.mem.lastIndexOfAny(u8, self.inputbox.text.items, "/\\. -_")) |pos| { self.inputbox.text.shrinkRetainingCapacity(pos); @@ -326,6 +342,11 @@ const cmds = struct { } 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 { self.menu.activate_selected(); }