以编程方式使 lua 中的十六进制颜色变亮或变暗 - nvim 高亮颜色
Programmatically Lighten or Darken a hex color in lua - nvim highlight colors
目标是以编程方式更改 lua 中的十六进制颜色亮度。
这个 post 包含几个很好的 js 示例:Programmatically Lighten or Darken a hex color (or rgb, and blend colors)
我很幸运地转换了其中一个函数,但我对 lua 编程还是很陌生。它只需要使用十六进制值,不需要 rgb 或其他变体。因此,我认为“更简单”的答案可以作为灵感,但我仍然没有运气。
最终它将用于在nvim 中操作高亮颜色。我正在使用我编写的函数获取颜色代码:
local function get_color(synID, what)
local command = 'echo synIDattr(hlID("' .. synID .. '"),' .. '"' .. what .. '"' .. ')'
return vim.api.nvim_command_output(command)
end
特别是在 5.3 中引入了位运算符后,Javascript 引用只需稍作改动即可工作:
function LightenDarkenColor(col, amt)
col = tonumber(col, 16)
return string.format("%#x", ((col & 0x0000FF) + amt) | ((((col >> 8) & 0x00FF) + amt) << 8) | (((col >> 16) + amt) << 16))
end
print(LightenDarkenColor("3F6D2A", 40))
parseInt
变成了 tonumber
和 toString(16)
string.format("%#x", ...)
请注意,此函数不会对溢出执行任何错误处理。
链接页面的第二个函数可以用同样的方式移植。 var
将是 Lua 中的 local
。
对于 Lua 5.2 及以下版本,您需要使用 bit functions。我移植了第二个函数,因为它很快就会变得非常难以阅读:
function LightenDarkenColor(col, amt)
local num = tonumber(col, 16)
local r = bit.rshift(num, 16) + amt
local b = bit.band(bit.rshift(num, 8), 0x00FF) + amt
local g = bit.band(num, 0x0000FF) + amt
local newColor = bit.bor(g, bit.bor(bit.lshift(b, 8), bit.lshift(r, 16)))
return string.format("%#x", newColor)
end
我不会在 Lua 5.2 及更低版本中求助于位操作,尤其是因为 Lua 5.1 缺少它们(LuaJIT 但确实提供了它们);请改用乘法、底除法和 mod,并注意限制您的值:
local function clamp(component)
return math.min(math.max(component, 0), 255)
end
function LightenDarkenColor(col, amt)
local num = tonumber(col, 16)
local r = math.floor(num / 0x10000) + amt
local g = (math.floor(num / 0x100) % 0x100) + amt
local b = (num % 0x100) + amt
return string.format("%#x", clamp(r) * 0x10000 + clamp(g) * 0x100 + clamp(b))
end
目标是以编程方式更改 lua 中的十六进制颜色亮度。
这个 post 包含几个很好的 js 示例:Programmatically Lighten or Darken a hex color (or rgb, and blend colors)
我很幸运地转换了其中一个函数,但我对 lua 编程还是很陌生。它只需要使用十六进制值,不需要 rgb 或其他变体。因此,我认为“更简单”的答案可以作为灵感,但我仍然没有运气。
最终它将用于在nvim 中操作高亮颜色。我正在使用我编写的函数获取颜色代码:
local function get_color(synID, what)
local command = 'echo synIDattr(hlID("' .. synID .. '"),' .. '"' .. what .. '"' .. ')'
return vim.api.nvim_command_output(command)
end
特别是在 5.3 中引入了位运算符后,Javascript 引用只需稍作改动即可工作:
function LightenDarkenColor(col, amt)
col = tonumber(col, 16)
return string.format("%#x", ((col & 0x0000FF) + amt) | ((((col >> 8) & 0x00FF) + amt) << 8) | (((col >> 16) + amt) << 16))
end
print(LightenDarkenColor("3F6D2A", 40))
parseInt
变成了 tonumber
和 toString(16)
string.format("%#x", ...)
请注意,此函数不会对溢出执行任何错误处理。
链接页面的第二个函数可以用同样的方式移植。 var
将是 Lua 中的 local
。
对于 Lua 5.2 及以下版本,您需要使用 bit functions。我移植了第二个函数,因为它很快就会变得非常难以阅读:
function LightenDarkenColor(col, amt)
local num = tonumber(col, 16)
local r = bit.rshift(num, 16) + amt
local b = bit.band(bit.rshift(num, 8), 0x00FF) + amt
local g = bit.band(num, 0x0000FF) + amt
local newColor = bit.bor(g, bit.bor(bit.lshift(b, 8), bit.lshift(r, 16)))
return string.format("%#x", newColor)
end
我不会在 Lua 5.2 及更低版本中求助于位操作,尤其是因为 Lua 5.1 缺少它们(LuaJIT 但确实提供了它们);请改用乘法、底除法和 mod,并注意限制您的值:
local function clamp(component)
return math.min(math.max(component, 0), 255)
end
function LightenDarkenColor(col, amt)
local num = tonumber(col, 16)
local r = math.floor(num / 0x10000) + amt
local g = (math.floor(num / 0x100) % 0x100) + amt
local b = (num % 0x100) + amt
return string.format("%#x", clamp(r) * 0x10000 + clamp(g) * 0x100 + clamp(b))
end