以编程方式使 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 变成了 tonumbertoString(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