Files
NeovimConfig/highlight.lua
T

169 lines
7.0 KiB
Lua

local M = {}
HlPrefix = "SL_Highlight_"
Colors = {
{ name="Red", ctermfg="red", fg = "red" },
{ name="Green", ctermfg="green", fg = "green" },
{ name="Blue", ctermfg="blue", fg = "blue" },
{ name="Black on Red", ctermfg="black", ctermbg="magenta", fg="black", bg="IndianRed" },
{ name="Black on Green", ctermfg="black", ctermbg="green", fg="black", bg="chartreuse" },
{ name="Black on Cyan", ctermfg="black", ctermbg="cyan", fg="black", bg="DeepSkyBlue" },
{ name="White on Red", ctermfg="white", ctermbg="DarkRed", fg="white", bg="firebrick" },
{ name="White on Green", ctermfg="white", ctermbg="DarkGreen", fg="white", bg="DarkGreen" },
{ name="White on Blue", ctermfg="white", ctermbg="DarkBlue", fg="white", bg="DarkSlateBlue" },
{ name="Black on White", fg="black", bg="thistle" },
{ name="Black on Baige", fg="black", bg="burlywood" },
{ name="Black on Powder Blue", fg="black", bg="PowderBlue" },
{ name="Black on Orange", fg="black", bg="peru" },
{ name="Black on Dark Sea Green", fg="black", bg="DarkSeaGreen" },
{ name="Black on Steel Blue", fg="black", bg="SteelBlue" },
{ name="Black on Dark Orange", fg="black", bg="DarkOrange" },
{ name="Black on Dark Olive Green", fg="black", bg="DarkOliveGreen" },
{ name="Black on Slate Gray", fg="black", bg="SlateGray" },
{ name="Red on Dark Grey", fg="red", bg="grey20" },
{ name="Green on Dark Grey", fg="green", bg="grey20" },
{ name="Blue on Dark Grey", fg="CornflowerBlue",bg="grey20" },
{ name="Red on Semi Dark Grey", fg="red", bg="grey40" },
{ name="Green on Semi Dark Grey", fg="green", bg="grey40" },
{ name="Blue on Semi Dark Grey", fg="blue", bg="grey40" },
{ name="Red on Grey", fg="red", bg="grey70" },
{ name="Green on Grey", fg="DarkGreen", bg="grey70" },
{ name="Blue on Grey", fg="blue", bg="grey70" },
}
ActiveHighlights = { }
M.setup = function ()
table.sort(Colors, function (a, b) return a.name < b.name end)
-- Defining highlight groups
for _, v in ipairs(Colors) do
local params = {}
for field, value in pairs(v) do
if field == "name" then
goto continue
end
params[field] = value
::continue::
end
local key = (v.ctermfg or "") .. (v.ctermbg or "") .. (v.fg or "") .. (v.bg or "")
vim.api.nvim_set_hl(0, HlPrefix .. key, params)
end
-- Defining command for applying highlight
vim.api.nvim_create_user_command(
"HL",
function(opts) PerformHighlight(opts) end,
{
desc = "idk",
range = true,
}
)
-- Defining command for opening highlight removal menu
vim.api.nvim_create_user_command(
"HC",
function(opts) ClearHighlight(opts) end,
{
desc = "idk",
range = true,
}
)
end
function PerformHighlight(opts)
local pattern = ""
-- If command argument provided, use it whole as highlight pattern
if string.len(opts.args) > 0 then
pattern = opts.args
-- If command is called with visual selection, extract text and use as pattern
elseif opts.range > 0 then
local region = vim.fn.getregion(
vim.fn.getpos("'<"),
vim.fn.getpos("'>"),
{ type = vim.fn.visualmode() }
)
pattern = table.concat(region, "\\n")
-- If nothing is provided, use current word under the cursor
else
pattern = vim.fn.expand("<cword>")
end
local options = { }
-- Defining options for highlight selection menu
for _, v in ipairs(Colors) do
table.insert(options, v.name)
end
-- Opening highlight selection menu
vim.ui.select(
options,
{ prompt = "Select highlight:" },
function(_, index)
if index == nil then
return
end
local v = Colors[index]
local key = (v.ctermfg or "") .. (v.ctermbg or "") .. (v.fg or "") .. (v.bg or "")
local match_id = vim.fn.matchadd(HlPrefix .. key, pattern, 10, -1)
table.insert(ActiveHighlights, {
id = match_id,
pattern = pattern,
hl = HlPrefix .. key,
})
end
)
-- Call matchadd function on highlight selection menu to provide highlighting preview
vim.defer_fn(function ()
local win = vim.api.nvim_get_current_win()
for i, v in ipairs(Colors) do
local key = (v.ctermfg or "") .. (v.ctermbg or "") .. (v.fg or "") .. (v.bg or "")
vim.fn.matchadd(HlPrefix .. key, i .. ". " .. v.name, 10, -1, { window = win + 1 })
end
end, 50)
end
function ClearHighlight(opts)
if opts.args == "*" then
vim.fn.clearmatches()
return
end
local options = { "All" }
for _, v in ipairs(ActiveHighlights) do
table.insert(options, v.pattern)
end
vim.ui.select(
options,
{ prompt = "Select highlight:" },
function(_, index)
if index == nil then
return
end
if index == 1 then
for _, v in ipairs(ActiveHighlights) do
vim.fn.matchdelete(v.id)
end
ActiveHighlights = { }
return
end
print(ActiveHighlights[index - 1].pattern)
vim.fn.matchdelete(ActiveHighlights[index - 1].id)
table.remove(ActiveHighlights, index - 1)
end
)
-- Call matchadd function on highlight removal menu to provide highlighting preview
vim.defer_fn(function ()
local win = vim.api.nvim_get_current_win()
for i, v in ipairs(ActiveHighlights) do
local pattern = string.gsub(v.pattern, "\\n", "\\\\n")
print(pattern)
vim.fn.matchadd(v.hl, (i + 1) .. ". " .. pattern, 10, -1, { window = win + 1 })
end
end, 50)
end
return M