From 4f39bbbd41355b25bc8bfef36186c97d818f9ee4 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Wed, 24 Dec 2025 00:02:41 +0100 Subject: [PATCH] refactor: add support for delete word during completion --- src/keybind/builtin/flow.json | 2 ++ src/tui/mode/overlay/dropdown.zig | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/keybind/builtin/flow.json b/src/keybind/builtin/flow.json index 41af849..ed65972 100644 --- a/src/keybind/builtin/flow.json +++ b/src/keybind/builtin/flow.json @@ -386,6 +386,7 @@ ["ctrl+down", "palette_menu_down"], ["ctrl+enter", "palette_menu_activate"], ["tab", "palette_menu_complete"], + ["ctrl+backspace", "overlay_delete_word_left"], ["backspace", "overlay_delete_backwards"] ] }, @@ -400,6 +401,7 @@ ["down", "palette_menu_down"], ["enter", "palette_menu_activate"], ["tab", "palette_menu_complete"], + ["ctrl+backspace", "overlay_delete_word_left"], ["backspace", "overlay_delete_backwards"] ] }, diff --git a/src/tui/mode/overlay/dropdown.zig b/src/tui/mode/overlay/dropdown.zig index a629c84..1a54f85 100644 --- a/src/tui/mode/overlay/dropdown.zig +++ b/src/tui/mode/overlay/dropdown.zig @@ -353,6 +353,17 @@ pub fn Create(options: type) type { return matches.items.len; } + fn delete_word(self: *Self) !void { + if (std.mem.lastIndexOfAny(u8, self.query.items, "/\\. -_")) |pos| { + self.query.shrinkRetainingCapacity(pos); + } else { + self.query.shrinkRetainingCapacity(0); + } + if (@hasDecl(options, "update_query")) + options.update_query(self, self.query.items); + return self.start_query(0); + } + fn delete_code_point(self: *Self) !void { if (self.query.items.len > 0) { self.query.shrinkRetainingCapacity(self.query.items.len - tui.egc_last(self.query.items).len); @@ -532,6 +543,11 @@ pub fn Create(options: type) type { } pub const palette_menu_cancel_meta: Meta = .{}; + pub fn overlay_delete_word_left(self: *Self, _: Ctx) Result { + self.delete_word() catch |e| return tp.exit_error(e, @errorReturnTrace()); + } + pub const overlay_delete_word_left_meta: Meta = .{ .description = "Delete word to the left" }; + pub fn overlay_delete_backwards(self: *Self, _: Ctx) Result { self.delete_code_point() catch |e| return tp.exit_error(e, @errorReturnTrace()); }