From f09bbbb7a94a5c92b7ca21855a9e7bd57bb4b308 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Wed, 17 Dec 2025 10:01:18 +0100 Subject: [PATCH 1/3] fix: reset cursor to start when clearing find query buffer --- src/tui/mode/mini/find.zig | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tui/mode/mini/find.zig b/src/tui/mode/mini/find.zig index a887b40..c27bfdc 100644 --- a/src/tui/mode/mini/find.zig +++ b/src/tui/mode/mini/find.zig @@ -113,7 +113,8 @@ fn flush_input(self: *Self) !void { .case_folded => .case_folded, }); } else { - self.editor.get_primary().selection = null; + self.editor.get_primary().cursor = self.start_cursor; + self.editor.scroll_to(self.start_view.row); self.editor.init_matches_update(); } } From 6de60f681f6a05c371daa946695380a5e58140f6 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Wed, 17 Dec 2025 10:34:11 +0100 Subject: [PATCH 2/3] feat: add initial_find_query config option --- src/config.zig | 8 ++++++++ src/tui/mode/mini/find.zig | 20 ++++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/config.zig b/src/config.zig index 9c3b676..ac1226d 100644 --- a/src/config.zig +++ b/src/config.zig @@ -32,6 +32,7 @@ enable_auto_save: bool = false, limit_auto_save_file_types: ?[]const []const u8 = null, // null means *all* enable_prefix_keyhints: bool = true, enable_auto_find: bool = true, +initial_find_query: InitialFindQuery = .selection, ignore_filter_stderr: bool = false, auto_run_time_seconds: usize = 120, //seconds @@ -151,3 +152,10 @@ pub const KeybindMode = enum { normal, ignore_alt_text_modifiers, }; + +pub const InitialFindQuery = enum { + empty, + selection, + last_query, + selection_or_last_query, +}; diff --git a/src/tui/mode/mini/find.zig b/src/tui/mode/mini/find.zig index c27bfdc..f68b0b0 100644 --- a/src/tui/mode/mini/find.zig +++ b/src/tui/mode/mini/find.zig @@ -51,10 +51,14 @@ pub fn create(allocator: Allocator, ctx: command.Context) !struct { tui.Mode, tu var query: []const u8 = undefined; if (ctx.args.match(.{ cbor.extract(&self.find_mode), cbor.extract(&query) }) catch false) { try self.input_.appendSlice(self.allocator, query); - } else if (editor.get_primary().selection) |sel| ret: { - const text = editor.get_selection(sel, self.allocator) catch break :ret; - defer self.allocator.free(text); - try self.input_.appendSlice(self.allocator, text); + } else switch (tui.config().initial_find_query) { + .empty => {}, + .selection => try self.set_from_current_selection(editor), + .last_query => self.find_history_prev(), + .selection_or_last_query => { + try self.set_from_current_selection(editor); + if (self.input_.items.len == 0) self.find_history_prev(); + }, } var mode = try keybind.mode("mini/find", allocator, .{ .insert_command = "mini_mode_insert_bytes", @@ -74,6 +78,14 @@ pub fn deinit(self: *Self) void { self.allocator.destroy(self); } +fn set_from_current_selection(self: *Self, editor: *ed.Editor) !void { + if (editor.get_primary().selection) |sel| ret: { + const text = editor.get_selection(sel, self.allocator) catch break :ret; + defer self.allocator.free(text); + try self.input_.appendSlice(self.allocator, text); + } +} + pub fn receive(self: *Self, _: tp.pid_ref, m: tp.message) error{Exit}!bool { var text: []const u8 = undefined; From 84225983b710e8bf07de4ff3e1bd115a7038e575 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Wed, 17 Dec 2025 10:44:17 +0100 Subject: [PATCH 3/3] fix: fully reset cursor position and clear matches in find mode --- src/tui/mode/mini/find.zig | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/tui/mode/mini/find.zig b/src/tui/mode/mini/find.zig index f68b0b0..367ca0a 100644 --- a/src/tui/mode/mini/find.zig +++ b/src/tui/mode/mini/find.zig @@ -125,9 +125,7 @@ fn flush_input(self: *Self) !void { .case_folded => .case_folded, }); } else { - self.editor.get_primary().cursor = self.start_cursor; - self.editor.scroll_to(self.start_view.row); - self.editor.init_matches_update(); + self.reset(); } } @@ -140,9 +138,15 @@ fn cmd(self: *Self, name_: []const u8, ctx: command.Context) tp.result { return command.executeName(name_, ctx); } -fn cancel(self: *Self) void { +fn reset(self: *Self) void { + self.editor.get_primary().selection = null; self.editor.get_primary().cursor = self.start_cursor; self.editor.scroll_to(self.start_view.row); + self.editor.clear_matches(); +} + +fn cancel(self: *Self) void { + self.reset(); command.executeName("exit_mini_mode", .{}) catch {}; }