--- flash.nvim: labeled jumps and enhanced motions ---@type LazySpec return { "folke/flash.nvim", event = "VeryLazy", ---@type Flash.Config opts = { modes = { char = { -- normal-mode `f` is the Vimium-style word jump and `F` is the -- 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 = { { "f", mode = "n", function() -- Vimium-c style: label every visible word start immediately, -- press a label to jump (no search pattern typed) require("flash").jump { search = { mode = "search", max_length = 0 }, label = { after = false, before = { 0, 0 } }, pattern = [[\<]], } end, desc = "Jump to word (Vimium-style)", }, { "F", mode = "n", function() -- 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" }, 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", }, { "s", mode = { "n", "x", "o" }, function() require("flash").jump() end, desc = "Flash" }, { "S", mode = { "n", "x", "o" }, function() require("flash").treesitter() end, desc = "Flash Treesitter" }, { "r", mode = "o", function() require("flash").remote() end, desc = "Remote Flash" }, { "R", mode = { "o", "x" }, function() require("flash").treesitter_search() end, desc = "Treesitter Search" }, { "", mode = { "c" }, function() require("flash").toggle() end, desc = "Toggle Flash Search" }, }, }