From 56b347b450a8a83a37881adcc61798b7a0745ff2 Mon Sep 17 00:00:00 2001 From: Prad Nukala Date: Sun, 12 Jul 2026 11:18:35 -0400 Subject: [PATCH] feat(flash): enhance search and jump labels for better usability --- lua/plugins/flash.lua | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/lua/plugins/flash.lua b/lua/plugins/flash.lua index 85e7466..2d5972b 100644 --- a/lua/plugins/flash.lua +++ b/lua/plugins/flash.lua @@ -11,7 +11,12 @@ return { -- search-style jump below, so flash's char mode must not rebind -- them; t/T/;/, stay enhanced keys = { "t", "T", ";", "," }, + -- show jump labels on the char-motion matches (t/T) + jump_labels = true, }, + -- label-enhanced regular `/` and `?` search; in cmdline + -- toggles it off for a plain search + search = { enabled = true }, }, }, keys = { @@ -33,13 +38,34 @@ return { "F", mode = "n", function() - -- Search-style flash: type a regex pattern (incremental, like - -- incsearch) and labels appear on every match. The pattern is - -- pushed to search history and the `/` register, so `n`/`N` - -- keep working after the jump. + -- Search-style flash: type a regex pattern and labels appear on + -- every match. While selecting, `n`/`N` cycle to the next/previous + -- result (flash consumes action keys before pattern input, so n/N + -- can't be typed into the pattern -- use `s` for those), + -- confirms the selection, a label jumps directly, cancels + -- back to the origin. The pattern is pushed to search history and + -- the `/` register, so `n`/`N` keep working after the jump. + local current ---@type Flash.Match? require("flash").jump { - search = { mode = "search", incremental = true }, + search = { mode = "search" }, jump = { history = true, register = true, nohlsearch = true }, + -- n/N are cycle keys, so never assign them as jump labels + label = { exclude = "nN" }, + actions = { + ["n"] = function(state) + -- first press selects the current target, then cycle forward + current = current and state:find { match = current, forward = true, wrap = true } or state.target + if current then state:jump(current) end + end, + ["N"] = function(state) + current = state:find { match = current or state.target, forward = false, wrap = true } + if current then state:jump(current) end + end, + [""] = function(state) + state:jump(current) -- nil falls back to state.target + return false -- end the loop + end, + }, } end, desc = "Flash search",