diff --git a/README.md b/README.md index d825fdc33..94b331a8c 100644 --- a/README.md +++ b/README.md @@ -357,6 +357,8 @@ require('fff').setup({ grep_jump_to_next_file = { '', '' }, grep_jump_to_prev_file = { '', '' }, cycle_previous_query = '', + -- unbound by default, wipes the whole input line + -- clear_query = '', -- overrides preview_scroll_up in insert mode toggle_select = '', send_to_quickfix = '', focus_list = 'l', diff --git a/lua/fff/conf.lua b/lua/fff/conf.lua index 0b7ad0b06..3c097fb5f 100644 --- a/lua/fff/conf.lua +++ b/lua/fff/conf.lua @@ -37,6 +37,7 @@ local M = {} --- @field insert_newline_escape string --- @field cycle_previous_query string --- @field cycle_forward_query string +--- @field clear_query string|string[]|nil --- @field grep_jump_to_next_file string|string[] --- @field grep_jump_to_prev_file string|string[] --- @field toggle_select string diff --git a/lua/fff/picker_ui/picker_ui.lua b/lua/fff/picker_ui/picker_ui.lua index 1731dad79..7b21ce2fb 100644 --- a/lua/fff/picker_ui/picker_ui.lua +++ b/lua/fff/picker_ui/picker_ui.lua @@ -52,6 +52,7 @@ M.on_input_change = search_manager.on_input_change M.cycle_grep_modes = search_manager.cycle_grep_modes M.recall_query_from_history = search_manager.recall_query_from_history M.cycle_forward_query = search_manager.cycle_forward_query +M.clear_query = search_manager.clear_query M.get_suggestion_renderer = search_manager.get_suggestion_renderer -- Wire renderer module (list rendering, scroll, empty state) diff --git a/lua/fff/picker_ui/search_manager.lua b/lua/fff/picker_ui/search_manager.lua index 544bfdb34..005cb0322 100644 --- a/lua/fff/picker_ui/search_manager.lua +++ b/lua/fff/picker_ui/search_manager.lua @@ -318,6 +318,19 @@ function M.recall_query_from_history() end) end +function M.clear_query() + if not P.state.active then return end + + S.history_offset = nil + vim.api.nvim_buf_set_lines(S.input_buf, 0, -1, false, { S.config.prompt }) + + vim.schedule(function() + if P.state.active and S.input_win and vim.api.nvim_win_is_valid(S.input_win) then + vim.api.nvim_win_set_cursor(S.input_win, { 1, #S.config.prompt }) + end + end) +end + function M.cycle_forward_query() if not P.state.active then return end diff --git a/lua/fff/picker_ui/ui_creator.lua b/lua/fff/picker_ui/ui_creator.lua index 502057b10..eeca3a80d 100644 --- a/lua/fff/picker_ui/ui_creator.lua +++ b/lua/fff/picker_ui/ui_creator.lua @@ -389,6 +389,8 @@ function M.setup_keymaps() set_keymap({ 'i', 'n' }, keymaps.toggle_select, P.toggle_select, input_opts) set_keymap({ 'i', 'n' }, keymaps.send_to_quickfix, P.send_to_quickfix, input_opts) set_keymap({ 'i', 'n' }, keymaps.cycle_grep_modes, P.cycle_grep_modes, input_opts) + -- last, so an explicitly configured key wins over the built-in bound to it + set_keymap('i', keymaps.clear_query, P.clear_query, input_opts) if keymaps.insert_newline_escape then -- Inserts the literal 2-char `\n` sequence which the grep engine