Files
neovim-config/lua/utils/highlight.lua
T

314 lines
9.4 KiB
Lua

---@module "utils.highlight"
--- This module provides functions to apply highlights to the statusline and other components.
-- ╭─────────────────────────────────────────────────────────╮
-- │ Highlight │
-- ╰─────────────────────────────────────────────────────────╯
local M = {}
-- Load utils
local data = require("data")
local funcs = data.func
-- Readability functions
local get_bg_color = funcs.get_bg_color
local get_fg_color = funcs.get_fg_color
local set_hl = vim.api.nvim_set_hl
local sign_def = vim.fn.sign_define
--- Function to apply the todo highlights
---@param status_string string The todo status string
---@return string The updated status string with the todo highlights
function M.apply_todo_highlights(status_string)
-- Define patterns and associated highlight groups
local patterns = {
{ icon = "", hl = "lualine_c_diagnostics_info_normal" },
{ icon = "", hl = "lualine_c_diagnostics_warning_normal" },
{ icon = "", hl = "lualine_c_diagnostics_warning_normal" },
{ icon = "", hl = "lualine_c_diagnostics_hint_normal" },
{ icon = "", hl = "lualine_c_diagnostics_hint_normal" },
}
-- Apply the highlights
for _, pattern in ipairs(patterns) do
status_string = status_string:gsub(
vim.pesc(pattern.icon),
"%#" .. pattern.hl .. "#" .. pattern.icon
)
end
-- Reset highlight to normal after the string
status_string = status_string .. "%#LualineNormal#"
return status_string
end
function M.setup_minimap_highlight()
vim.api.nvim_set_hl(
0,
"NeominimapSearchIcon",
{ link = "NeominimapErrorSign" }
)
vim.api.nvim_set_hl(
0,
"NeominimapSearchLine",
{ link = "NeominimapErrorLine" }
)
end
--- Function to set up indent highlights
---@return nil
function M.setup_indent_highlight()
-- Get the background color of CursorLine
local cursorline_bg_hex = get_bg_color("CursorLine")
-- Get the foreground color of Error
local miniiconsred_fg_hex = get_fg_color("Error")
-- Load the ibl plugin hooks
local hooks = require("ibl.hooks")
-- create the highlight groups in the highlight setup hook
if cursorline_bg_hex then
-- Define custom highlight groups for indent
hooks.register(hooks.type.HIGHLIGHT_SETUP, function()
set_hl(
0,
"IndentBlanklineIndent",
{ fg = cursorline_bg_hex, nocombine = true }
)
set_hl(
0,
"IndentsScopeHighlight",
{ fg = miniiconsred_fg_hex, nocombine = true }
)
end)
end
-- Define characters for indent-blankline
local tab_char, indent_char
if vim.g.tab_char then
tab_char = vim.g.tab_char
elseif vim.g.tab_char_name then
tab_char = data.types.ibl.char[vim.g.tab_char_name]
else
tab_char = data.types.ibl.char.none
end
if vim.g.indent_char then
indent_char = vim.g.indent_char
elseif vim.g.indent_char_name then
indent_char = data.types.ibl.char[vim.g.indent_char_name]
else
indent_char = data.types.ibl.char.none
end
-- Configure the indent-blankline plugin
require("ibl").setup({
indent = {
char = indent_char,
tab_char = tab_char,
highlight = {
"IndentBlanklineIndent",
},
},
scope = {
enabled = false,
},
exclude = {
filetypes = data.types.highlights.exclude,
},
})
-- Configure the deadcolumn plugin
require("deadcolumn").setup({
scope = "line", ---@type string|fun(): integer
modes = function(mode)
return mode:find("^[ictRss\x13]") ~= nil
end,
blending = {
threshold = 0.9,
colorcode = cursorline_bg_hex,
hlgroup = { "Normal", "bg" },
},
warning = {
alpha = 0.4,
offset = 0,
colorcode = miniiconsred_fg_hex,
hlgroup = { "Error", "bg" },
},
extra = {
follow_tw = "80",
},
})
-- Set NeoCodeium suggestion highlight
vim.api.nvim_set_hl(0, "NeoCodeiumSuggestion", { link = "Comment" })
-- Set NeoCodeium label highlight
vim.api.nvim_set_hl(0, "NeoCodeiumLabel", { link = "lualine_a_insert" })
end
--- Function to set up smooth cursor mode highlights
---@return nil
function M.setup_mode_highlight()
local current_mode = vim.fn.mode()
local bg_color -- Define bg_color variable
if current_mode == "n" then
bg_color = get_bg_color("MiniStatuslineModeNormal")
set_hl(0, "SmoothCursor", { fg = bg_color })
sign_def("smoothcursor", { text = "" })
elseif current_mode == "v" then
bg_color = get_bg_color("MiniStatuslineModeVisual")
set_hl(0, "SmoothCursor", { fg = bg_color })
sign_def("smoothcursor", { text = "" })
elseif current_mode == "V" then
bg_color = get_bg_color("MiniStatuslineModeVisual")
set_hl(0, "SmoothCursor", { fg = bg_color })
sign_def("smoothcursor", { text = "" })
elseif current_mode == "R" or current_mode == "r" then
bg_color = get_bg_color("MiniStatuslineModeReplace")
set_hl(0, "SmoothCursor", { fg = bg_color })
sign_def("smoothcursor", { text = "" })
elseif current_mode == "i" then
bg_color = get_bg_color("MiniStatuslineModeInsert")
set_hl(0, "SmoothCursor", { fg = bg_color })
sign_def("smoothcursor", { text = "" })
else
bg_color = get_bg_color("MiniStatuslineModeNormal")
set_hl(0, "SmoothCursor", { fg = bg_color })
sign_def("smoothcursor", { text = "" })
end
end
--- Function to set up dashboard header highlight
---@return nil
function M.setup_dashboard_highlight()
if not vim.g.DashboardHeaderColor then
local dash_color = get_fg_color("Error")
set_hl(0, "DashboardHeader", { fg = dash_color })
else
set_hl(0, "DashboardHeader", { fg = vim.g.DashboardHeaderColor })
end
end
--- Function to set up transparency of the editor
---@return nil
function M.setup_transparency()
if data.func.is_kitty() and not vim.g.disable_transparency then
vim.cmd("TransparentEnable")
else
vim.cmd("TransparentDisable")
end
end
function M.setup_avante_highlights()
-- Apply highlights for title
set_hl(0, "AvanteTitle", { link = "lualine_a_command" })
set_hl(0, "AvanteReversedTitle", {
bg = get_bg_color("Normal"),
fg = get_bg_color("lualine_a_command"),
})
-- Apply highlights for subtitle
set_hl(0, "AvanteSubtitle", { link = "lualine_a_replace" })
set_hl(0, "AvanteReversedSubtitle", {
bg = get_bg_color("Normal"),
fg = get_bg_color("lualine_a_replace"),
})
-- Apply highlights for prompt
set_hl(0, "AvanteThirdTitle", { link = "lualine_a_insert" })
set_hl(0, "AvanteReversedThirdTitle", {
bg = get_bg_color("Normal"),
fg = get_bg_color("lualine_a_insert"),
})
-- Apply highlights for hints
set_hl(0, "AvanteInlineHint", { link = "LspDiagnosticsVirtualTextHint" })
set_hl(0, "AvantePopupHint", { link = "DiagnosticVirtualTextHint" })
end
--- Function to set up autocommands
---@return nil
function M.setup_autocommands()
local autogrp = vim.api.nvim_create_augroup
local autocmd = vim.api.nvim_create_autocmd
-- List of filetypes to exclude
local excluded_filetypes = data.types.highlights.exclude
-- Create a new augroup for the IndentHighlight
local IndentGroup = autogrp("IndentHighlight", { clear = true })
-- Autocommand to trigger setup on FileType
autocmd("FileType", {
group = IndentGroup,
callback = function()
local filetype = vim.bo.filetype
if not vim.tbl_contains(excluded_filetypes, filetype) then
M.setup_indent_highlight()
M.setup_minimap_highlight()
M.setup_avante_highlights()
else
if pcall(require, "auto-cursorline") then
require("auto-cursorline").disable({
buffer = true,
})
end
end
end,
})
-- Autocommand to trigger setup on ColorScheme
autocmd("ColorScheme", {
pattern = "*",
group = IndentGroup,
callback = function()
M.setup_indent_highlight()
end,
})
-- Autocommand to trigger setup on ModeChanged
autogrp("ModeHighlighting", { clear = true })
autocmd("ModeChanged", {
group = "ModeHighlighting",
callback = function()
M.setup_mode_highlight()
end,
})
-- Create a new augroup for the dashboard
local dashboardGroup = autogrp("DashboardColors", { clear = true })
-- Autocommand to trigger setup on FileType
autocmd("FileType", {
pattern = "*",
group = dashboardGroup,
callback = function()
M.setup_dashboard_highlight()
end,
})
-- Reapply highlights when the colorscheme changes
autocmd("ColorScheme", {
pattern = "*",
group = dashboardGroup,
callback = function()
M.setup_dashboard_highlight()
end,
})
-- Create a new augroup for the terminal background
local terminalGroup = autogrp("TerminalColors", { clear = true })
-- Match neovim and terminal background colors
autocmd({ "UIEnter", "ColorScheme" }, {
group = terminalGroup,
callback = function()
local normal = vim.api.nvim_get_hl(0, { name = "Normal" })
if not normal.bg then
return
end
io.write(string.format("\027]11;#%06x\027\\", normal.bg))
end,
})
-- Reset terminal background on UILeave
autocmd("UILeave", {
group = terminalGroup,
callback = function()
io.write("\027]111\027\\")
end,
})
end
return M