291 lines
9.3 KiB
Lua
291 lines
9.3 KiB
Lua
---@module "utils.highlight"
|
|
--- This module provides functions to apply highlights to the statusline and other components.
|
|
-- ╭─────────────────────────────────────────────────────────╮
|
|
-- │ Highlight │
|
|
-- ╰─────────────────────────────────────────────────────────╯
|
|
|
|
local M = {}
|
|
|
|
-- Readability functions
|
|
local get_bg_color = require('data.func').get_bg_color
|
|
local get_fg_color = require('data.func').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') or '#1d1d2d'
|
|
|
|
-- Get the foreground color of Error
|
|
local miniiconsred_fg_hex = get_fg_color('Error') or '#ff5555'
|
|
|
|
-- Load the ibl plugin
|
|
if pcall(require, 'ibl') then
|
|
-- 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 = require('data.types').ibl.char[vim.g.tab_char_name]
|
|
else
|
|
tab_char = require('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 = require('data.types').ibl.char[vim.g.indent_char_name]
|
|
else
|
|
indent_char = require('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 = require('data.types').highlights.exclude,
|
|
},
|
|
})
|
|
end
|
|
|
|
-- Configure the deadcolumn plugin
|
|
if pcall(require, 'deadcolumn') then
|
|
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',
|
|
},
|
|
})
|
|
end
|
|
|
|
-- 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
|
|
|
|
-- Define the custom highlight outside the function
|
|
local vis_bg_color = get_bg_color('CursorLineNr')
|
|
local vis_fg_color = get_bg_color('lualine_a_visual')
|
|
vim.api.nvim_set_hl(
|
|
0,
|
|
'StatusColumnVisualHighlight',
|
|
{ fg = vis_fg_color, bg = vis_bg_color }
|
|
)
|
|
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 require('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 M.setup_multi_cursor_highlight()
|
|
-- Customize how cursors look.
|
|
vim.api.nvim_set_hl(0, 'MultiCursorCursor', { link = 'Cursor' })
|
|
vim.api.nvim_set_hl(0, 'MultiCursorVisual', { link = 'Visual' })
|
|
vim.api.nvim_set_hl(0, 'MultiCursorSign', { link = 'GitSignsAdd' })
|
|
vim.api.nvim_set_hl(0, 'MultiCursorDisabledCursor', { link = 'Visual' })
|
|
vim.api.nvim_set_hl(0, 'MultiCursorDisabledVisual', { link = 'Visual' })
|
|
vim.api.nvim_set_hl(0, 'MultiCursorDisabledSign', { link = 'SignColumn' })
|
|
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 = require('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()
|
|
M.setup_multi_cursor_highlight()
|
|
else
|
|
if pcall(require, 'auto-cursorline') then
|
|
require('auto-cursorline').disable({
|
|
buffer = true,
|
|
})
|
|
end
|
|
end
|
|
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,
|
|
})
|
|
end
|
|
|
|
return M
|