A Neovim plugin that colorizes multiple search terms with multiple distinct colors for better visual tracking.
kaleidosearch.mp4
- Highlight multiple search terms with different colors
- Navigate between matches using standard search commands (n/N)
- Add words incrementally without losing existing highlights
- Add word under cursor with a single keymap AND remove it (toggle)
- Add visual selection to highlights
- dot-repeatable: Hit
.at any point and the colors will change - Colorize entire lines, giving identical lines the same color
- Vim
wordtoken mode respects your buffer’siskeywordsetting - Colorize real
tiktokentoken spans in the buffer
Using your favorite plugin manager:
{
"hamidi-dev/kaleidosearch.nvim",
dependencies = {
"tpope/vim-repeat", -- optional for dot-repeatability
"stevearc/dressing.nvim", -- optional for nice input
},
config = function()
require("kaleidosearch").setup({
-- optional configuration
})
end,
}use {
'hamidi-dev/kaleidosearch.nvim',
requires = {
'tpope/vim-repeat', -- optional for dot-repeatability
'stevearc/dressing.nvim', -- optional for nice input
},
config = function()
require('kaleidosearch').setup({
-- optional configuration
})
end
}| Command | Description |
|---|---|
:Kaleidosearch word1 word2 | Highlight specified words with colors |
:KaleidosearchClear | Clear all highlighted words |
:KaleidosearchAddWord | Add a new word to existing highlights |
:KaleidosearchToggleCursorWord | Toggle word under cursor/selection highlight |
:KaleidosearchColorWords | Colorize all vim word tokens in buffer |
:KaleidosearchColorWORDS | Colorize all vim WORD tokens in buffer |
:KaleidosearchColorLines | Colorize all lines, identical lines share colors |
:KaleidosearchColorTokens | Colorize real tiktoken token spans in buffer |
:KaleidosearchColorTokens! | Force token colorization for large buffers |
:KaleidosearchToggleTokens | Toggle tiktoken token span colors |
:KaleidosearchInfo | Show current Kaleidosearch session info |
| Keymap | Action |
|---|---|
<leader>cs | Open prompt for words to colorize |
<leader>cc | Clear all highlighted words (reset to clean slate) |
<leader>cn | Add a new word to existing highlights |
<leader>ca | Add word under cursor to existing highlights |
<leader>cw | Colorize all vim word tokens in current buffer |
<leader>cW | Colorize all vim WORD tokens in current buffer |
<leader>cl | Colorize all lines in current buffer |
<leader>ct | Colorize real tiktoken tokens in current buffer |
require("kaleidosearch").setup({
highlight_group_prefix = "WordColor_", -- Prefix for highlight groups
case_sensitive = false, -- Case sensitivity for matching
whole_word_match = false, -- Only match whole words, not substrings
keymaps = {
enabled = true, -- Set to false to disable default keymaps
open = "<leader>cs", -- Open input prompt for search
clear = "<leader>cc", -- Clear highlights (reset to clean slate)
add_new_word = "<leader>cn", -- Add a new word to existing highlights
add_cursor_word = "<leader>ca", -- Add word under cursor to highlights OR current visual selection
colorize_all_words = "<leader>cw", -- Colorize all vim 'word' tokens
colorize_all_WORDS = "<leader>cW", -- Colorize all vim 'WORD' tokens
colorize_all_lines = "<leader>cl", -- Colorize all lines in current buffer
colorize_tokens = "<leader>ct", -- Colorize real tiktoken tokens
opts = {
noremap = true,
silent = true,
}
},
token_colors = {
enabled = true,
model = "gpt-4o", -- tiktoken model
encoding = "o200k_base", -- fallback encoding
max_bytes = 200 * 1024, -- skip larger buffers unless forced
max_highlights = 20000, -- skip huge token counts unless forced
palette_size = 32,
saturation = 0.55,
lightness = 0.24,
priority = 120,
notify = true,
highlight_group_prefix = "KaleidosearchToken",
}
})Token colorization shells out asynchronously through uv run --with tiktoken when uv is available, otherwise it uses python3 or python with an installed tiktoken module. Regular :KaleidosearchClear and the clear keymap remove word, line, and token highlights.
This plugin includes unit tests using Plenary.nvim. To run the tests:
- Use the provided script (it will install Plenary.nvim if needed):
./scripts/run_tests.sh- Or if you’re inside Neovim with Plenary installed:
:PlenaryBustedDirectory test/ {minimal_init = 'test/minimal_init.lua'}- PRs welcome 😃
- Ideas / issues welcome
MIT License