feat(highlight): add configurable blend alpha

Problem: the character-level blend intensity was hardcoded to 0.6,
giving users no way to tune how strongly changed characters stand out
from the line-level background.

Solution: add highlights.blend_alpha config option (number, 0-1,
default 0.6) with type validation and range check.
This commit is contained in:
Barrett Ruth 2026-02-07 15:46:47 -05:00
parent 8e0c41bf6b
commit b7477e3af2
2 changed files with 20 additions and 2 deletions

View file

@ -56,6 +56,7 @@ Configuration is done via `vim.g.diffs`. Set this before the plugin loads:
highlights = { highlights = {
background = true, background = true,
gutter = true, gutter = true,
blend_alpha = 0.6,
context = { context = {
enabled = true, enabled = true,
lines = 25, lines = 25,
@ -117,6 +118,13 @@ Configuration is done via `vim.g.diffs`. Set this before the plugin loads:
Highlight line numbers with matching colors. Highlight line numbers with matching colors.
Only visible if line numbers are enabled. Only visible if line numbers are enabled.
{blend_alpha} (number, default: 0.6)
Alpha value for character-level blend intensity.
Controls how strongly changed characters stand
out from the line-level background. Must be
between 0 and 1 (inclusive). Higher values
produce more vivid character-level highlights.
{context} (table, default: see below) {context} (table, default: see below)
Syntax parsing context options. Syntax parsing context options.
See |diffs.ContextConfig| for fields. See |diffs.ContextConfig| for fields.

View file

@ -18,6 +18,7 @@
---@class diffs.Highlights ---@class diffs.Highlights
---@field background boolean ---@field background boolean
---@field gutter boolean ---@field gutter boolean
---@field blend_alpha? number
---@field context diffs.ContextConfig ---@field context diffs.ContextConfig
---@field treesitter diffs.TreesitterConfig ---@field treesitter diffs.TreesitterConfig
---@field vim diffs.VimConfig ---@field vim diffs.VimConfig
@ -192,8 +193,9 @@ local function compute_highlight_groups()
local blended_add = blend_color(add_bg, bg, 0.4) local blended_add = blend_color(add_bg, bg, 0.4)
local blended_del = blend_color(del_bg, bg, 0.4) local blended_del = blend_color(del_bg, bg, 0.4)
local blended_add_text = blend_color(add_fg, bg, 0.6) local alpha = config.highlights.blend_alpha or 0.6
local blended_del_text = blend_color(del_fg, bg, 0.6) local blended_add_text = blend_color(add_fg, bg, alpha)
local blended_del_text = blend_color(del_fg, bg, alpha)
vim.api.nvim_set_hl(0, 'DiffsClear', { default = true, fg = normal.fg or 0xc0c0c0 }) vim.api.nvim_set_hl(0, 'DiffsClear', { default = true, fg = normal.fg or 0xc0c0c0 })
vim.api.nvim_set_hl(0, 'DiffsAdd', { default = true, bg = blended_add }) vim.api.nvim_set_hl(0, 'DiffsAdd', { default = true, bg = blended_add })
@ -248,6 +250,7 @@ local function init()
vim.validate({ vim.validate({
['highlights.background'] = { opts.highlights.background, 'boolean', true }, ['highlights.background'] = { opts.highlights.background, 'boolean', true },
['highlights.gutter'] = { opts.highlights.gutter, 'boolean', true }, ['highlights.gutter'] = { opts.highlights.gutter, 'boolean', true },
['highlights.blend_alpha'] = { opts.highlights.blend_alpha, 'number', true },
['highlights.context'] = { opts.highlights.context, 'table', true }, ['highlights.context'] = { opts.highlights.context, 'table', true },
['highlights.treesitter'] = { opts.highlights.treesitter, 'table', true }, ['highlights.treesitter'] = { opts.highlights.treesitter, 'table', true },
['highlights.vim'] = { opts.highlights.vim, 'table', true }, ['highlights.vim'] = { opts.highlights.vim, 'table', true },
@ -348,6 +351,13 @@ local function init()
then then
error('diffs: highlights.intra.max_lines must be >= 1') error('diffs: highlights.intra.max_lines must be >= 1')
end end
if
opts.highlights
and opts.highlights.blend_alpha
and (opts.highlights.blend_alpha < 0 or opts.highlights.blend_alpha > 1)
then
error('diffs: highlights.blend_alpha must be >= 0 and <= 1')
end
config = vim.tbl_deep_extend('force', default_config, opts) config = vim.tbl_deep_extend('force', default_config, opts)
log.set_enabled(config.debug) log.set_enabled(config.debug)