When there are more matches than the single-char label pool (>|L|, i.e. > 26 with the default), issue two-char labels so matches past the single-char ceiling are still reachable. Tactics: - Cap: 2 * |L| = 52 labels total in two-char mode. The full |L|^2 = 676 space produces visually unusable density on packed buffers; 52 is plenty once the cursor-proximity sort lands them near the cursor. - Label order: first char varies slow (26 labels starting with 'f', next 26 starting with 'j') so only 'f' and 'j' become prefixes. The remaining 24 letters stay usable for pattern extension in two-char mode. - Per-line readability spacing: a 2-char label requires one column of original text between itself and the previous 2-char label on the same line. Prevents visual bleed when matches are adjacent (e.g. '0' search on timestamp-heavy text). Single-char mode unchanged. - No global mode flag: a 'prefixes' set, populated while assigning labels, tells the input loop when to buffer a second keystroke. The set resets each iteration with 'active'.
tiny-jump.nvim
A tiny, no-nonsense jump plugin for Neovim. Press a key to trigger, type
one or more characters to narrow the matches, then press the label to
jump. Like / but you don't have to n your way to the match you
actually wanted.
Credit and history
This plugin is a fork of yorickpeterse/nvim-jump, which is excellent and which I used happily for a long time. Big thanks to the original author for a clean, focused implementation.
I forked it because I wanted to pass label highlight attributes directly
to setup() (instead of having to define a separate highlight group and
re-apply it on every colorscheme change). I submitted that as a PR but
it was declined, which is the maintainer's right — the upstream plugin
is explicitly considered feature-complete. See the closed PR for
context: https://github.com/yorickpeterse/nvim-jump/pull/8.
Since the upstream code is MPL-2.0, a fork is fair game. This plugin is
a tiny extension of it — same core behavior, plus a slightly friendlier
highlight API — maintained under the tiny-* family of my other
Neovim plugins.
Requirements
- Neovim 0.11.0 or newer.
Install & basic usage
With vim.pack (Neovim 0.12+):
vim.pack.add({ 'https://github.com/swaits/tiny-jump.nvim' })
vim.keymap.set({ 'n', 'x', 'o' }, 's', require('tiny-jump').start)
Any plugin manager works — just point it at this repo and map
require('tiny-jump').start to a key.
Configuration
All settings are optional. Defaults:
require('tiny-jump').setup({
-- Labels that may be used, in order of preference.
labels = 'fdsaghjklrewqtyuiopvcxzbnm',
-- Highlight group used for match highlights (before labels are shown).
search = 'Search',
-- Highlight for labels. Accepts a group name (string) or a table of
-- `nvim_set_hl` attributes.
label = 'IncSearch',
})
Label colors
Point label at any existing highlight group:
require('tiny-jump').setup({ label = 'IncSearch' })
Or pass attributes inline and let the plugin manage the group for you.
It creates an internal TinyJumpLabel group and re-applies it on
ColorScheme so your colors survive theme changes:
require('tiny-jump').setup({
label = { fg = '#ffff00', bg = '#000000', bold = true },
})
Colemak
require('tiny-jump').setup({
labels = 'tnseriaogmplfuwyqbjdhvkzxc',
})
License
MPL-2.0, inherited from the upstream project. See LICENSE.