diff --git a/lua/nvim-web-devicons.lua b/lua/nvim-web-devicons.lua index 93791dcea..1d3974f8e 100644 --- a/lua/nvim-web-devicons.lua +++ b/lua/nvim-web-devicons.lua @@ -14,20 +14,351 @@ local global_opts = { color_icons = true, } +-- 8-bit, RGB hex +-- from https://gist.github.com/chrisdiana/c71f224626b5b9516bdb +local cterm_to_rgb_table = { + -- Primary 3-bit (8 colors). Unique representation! + [00] = "#000000", + [01] = "#800000", + [02] = "#008000", + [03] = "#808000", + [04] = "#000080", + [05] = "#800080", + [06] = "#008080", + [07] = "#c0c0c0", + + -- Equivalent "bright" versions of original 8 colors. + [08] = "#808080", + [09] = "#ff0000", + [10] = "#00ff00", + [11] = "#ffff00", + [12] = "#0000ff", + [13] = "#ff00ff", + [14] = "#00ffff", + [15] = "#ffffff", + + -- Strictly ascending. + [16] = "#000000", + [17] = "#00005f", + [18] = "#000087", + [19] = "#0000af", + [20] = "#0000d7", + [21] = "#0000ff", + [22] = "#005f00", + [23] = "#005f5f", + [24] = "#005f87", + [25] = "#005faf", + [26] = "#005fd7", + [27] = "#005fff", + [28] = "#008700", + [29] = "#00875f", + [30] = "#008787", + [31] = "#0087af", + [32] = "#0087d7", + [33] = "#0087ff", + [34] = "#00af00", + [35] = "#00af5f", + [36] = "#00af87", + [37] = "#00afaf", + [38] = "#00afd7", + [39] = "#00afff", + [40] = "#00d700", + [41] = "#00d75f", + [42] = "#00d787", + [43] = "#00d7af", + [44] = "#00d7d7", + [45] = "#00d7ff", + [46] = "#00ff00", + [47] = "#00ff5f", + [48] = "#00ff87", + [49] = "#00ffaf", + [50] = "#00ffd7", + [51] = "#00ffff", + [52] = "#5f0000", + [53] = "#5f005f", + [54] = "#5f0087", + [55] = "#5f00af", + [56] = "#5f00d7", + [57] = "#5f00ff", + [58] = "#5f5f00", + [59] = "#5f5f5f", + [60] = "#5f5f87", + [61] = "#5f5faf", + [62] = "#5f5fd7", + [63] = "#5f5fff", + [64] = "#5f8700", + [65] = "#5f875f", + [66] = "#5f8787", + [67] = "#5f87af", + [68] = "#5f87d7", + [69] = "#5f87ff", + [70] = "#5faf00", + [71] = "#5faf5f", + [72] = "#5faf87", + [73] = "#5fafaf", + [74] = "#5fafd7", + [75] = "#5fafff", + [76] = "#5fd700", + [77] = "#5fd75f", + [78] = "#5fd787", + [79] = "#5fd7af", + [80] = "#5fd7d7", + [81] = "#5fd7ff", + [82] = "#5fff00", + [83] = "#5fff5f", + [84] = "#5fff87", + [85] = "#5fffaf", + [86] = "#5fffd7", + [87] = "#5fffff", + [88] = "#870000", + [89] = "#87005f", + [90] = "#870087", + [91] = "#8700af", + [92] = "#8700d7", + [93] = "#8700ff", + [94] = "#875f00", + [95] = "#875f5f", + [96] = "#875f87", + [97] = "#875faf", + [98] = "#875fd7", + [99] = "#875fff", + [100] = "#878700", + [101] = "#87875f", + [102] = "#878787", + [103] = "#8787af", + [104] = "#8787d7", + [105] = "#8787ff", + [106] = "#87af00", + [107] = "#87af5f", + [108] = "#87af87", + [109] = "#87afaf", + [110] = "#87afd7", + [111] = "#87afff", + [112] = "#87d700", + [113] = "#87d75f", + [114] = "#87d787", + [115] = "#87d7af", + [116] = "#87d7d7", + [117] = "#87d7ff", + [118] = "#87ff00", + [119] = "#87ff5f", + [120] = "#87ff87", + [121] = "#87ffaf", + [122] = "#87ffd7", + [123] = "#87ffff", + [124] = "#af0000", + [125] = "#af005f", + [126] = "#af0087", + [127] = "#af00af", + [128] = "#af00d7", + [129] = "#af00ff", + [130] = "#af5f00", + [131] = "#af5f5f", + [132] = "#af5f87", + [133] = "#af5faf", + [134] = "#af5fd7", + [135] = "#af5fff", + [136] = "#af8700", + [137] = "#af875f", + [138] = "#af8787", + [139] = "#af87af", + [140] = "#af87d7", + [141] = "#af87ff", + [142] = "#afaf00", + [143] = "#afaf5f", + [144] = "#afaf87", + [145] = "#afafaf", + [146] = "#afafd7", + [147] = "#afafff", + [148] = "#afd700", + [149] = "#afd75f", + [150] = "#afd787", + [151] = "#afd7af", + [152] = "#afd7d7", + [153] = "#afd7ff", + [154] = "#afff00", + [155] = "#afff5f", + [156] = "#afff87", + [157] = "#afffaf", + [158] = "#afffd7", + [159] = "#afffff", + [160] = "#d70000", + [161] = "#d7005f", + [162] = "#d70087", + [163] = "#d700af", + [164] = "#d700d7", + [165] = "#d700ff", + [166] = "#d75f00", + [167] = "#d75f5f", + [168] = "#d75f87", + [169] = "#d75faf", + [170] = "#d75fd7", + [171] = "#d75fff", + [172] = "#d78700", + [173] = "#d7875f", + [174] = "#d78787", + [175] = "#d787af", + [176] = "#d787d7", + [177] = "#d787ff", + [178] = "#d7af00", + [179] = "#d7af5f", + [180] = "#d7af87", + [181] = "#d7afaf", + [182] = "#d7afd7", + [183] = "#d7afff", + [184] = "#d7d700", + [185] = "#d7d75f", + [186] = "#d7d787", + [187] = "#d7d7af", + [188] = "#d7d7d7", + [189] = "#d7d7ff", + [190] = "#d7ff00", + [191] = "#d7ff5f", + [192] = "#d7ff87", + [193] = "#d7ffaf", + [194] = "#d7ffd7", + [195] = "#d7ffff", + [196] = "#ff0000", + [197] = "#ff005f", + [198] = "#ff0087", + [199] = "#ff00af", + [200] = "#ff00d7", + [201] = "#ff00ff", + [202] = "#ff5f00", + [203] = "#ff5f5f", + [204] = "#ff5f87", + [205] = "#ff5faf", + [206] = "#ff5fd7", + [207] = "#ff5fff", + [208] = "#ff8700", + [209] = "#ff875f", + [210] = "#ff8787", + [211] = "#ff87af", + [212] = "#ff87d7", + [213] = "#ff87ff", + [214] = "#ffaf00", + [215] = "#ffaf5f", + [216] = "#ffaf87", + [217] = "#ffafaf", + [218] = "#ffafd7", + [219] = "#ffafff", + [220] = "#ffd700", + [221] = "#ffd75f", + [222] = "#ffd787", + [223] = "#ffd7af", + [224] = "#ffd7d7", + [225] = "#ffd7ff", + [226] = "#ffff00", + [227] = "#ffff5f", + [228] = "#ffff87", + [229] = "#ffffaf", + [230] = "#ffffd7", + [231] = "#ffffff", + + -- Gray-scale range. + [232] = "#080808", + [233] = "#121212", + [234] = "#1c1c1c", + [235] = "#262626", + [236] = "#303030", + [237] = "#3a3a3a", + [238] = "#444444", + [239] = "#4e4e4e", + [240] = "#585858", + [241] = "#626262", + [242] = "#6c6c6c", + [243] = "#767676", + [244] = "#808080", + [245] = "#8a8a8a", + [246] = "#949494", + [247] = "#9e9e9e", + [248] = "#a8a8a8", + [249] = "#b2b2b2", + [250] = "#bcbcbc", + [251] = "#c6c6c6", + [252] = "#d0d0d0", + [253] = "#dadada", + [254] = "#e4e4e4", + [255] = "#eeeeee", +} + +local light78 = 255 * 7 / 8 +local light68 = 255 * 6 / 8 +local light58 = 255 * 5 / 8 +local light12 = 255 / 2 +local light13 = 255 / 3 + +local function darken_color(rrggbb) + local r, g, b = rrggbb:match "%#(%x%x)(%x%x)(%x%x)" + r, g, b = tonumber("0x" .. r), tonumber("0x" .. g), tonumber("0x" .. b) + -- luminance formula: see https://stackoverflow.com/a/596243 + local lum = 0.299 * r + 0.587 * g + 0.114 * b + if lum < light13 then -------------------- darkest tertile + return rrggbb + elseif lum < light12 then ---------------- second darkest quartile + r = bit.tohex(r / 4 * 3):sub(-2) + g = bit.tohex(g / 4 * 3):sub(-2) + b = bit.tohex(b / 4 * 3):sub(-2) + elseif lum < light58 then ---------------- lightest octiles: first + r = bit.tohex(r / 3 * 2):sub(-2) + g = bit.tohex(g / 3 * 2):sub(-2) + b = bit.tohex(b / 3 * 2):sub(-2) + elseif lum < light68 then ---------------- lightest octiles: second + r = bit.tohex(r / 2):sub(-2) + g = bit.tohex(g / 2):sub(-2) + b = bit.tohex(b / 2):sub(-2) + elseif lum < light78 then ---------------- lightest octiles: third + r = bit.tohex(r / 3):sub(-2) + g = bit.tohex(g / 3):sub(-2) + b = bit.tohex(b / 3):sub(-2) + else ------------------------------------- lightest octile + r = bit.tohex(r / 5):sub(-2) + g = bit.tohex(g / 5):sub(-2) + b = bit.tohex(b / 5):sub(-2) + end + return string.format("#%s%s%s", r, g, b) +end + +---@param cterm string: The cterm color number +---@return string rgb Color value in `#rrggbb` format +local function cterm_to_rgb(cterm) + return cterm_to_rgb_table[tonumber(cterm)] +end + -- Set the current icons tables, depending on the 'background' option. local function refresh_icons() local theme + local overrides if vim.o.background == "light" then theme = require "nvim-web-devicons.icons-light" + overrides = vim.tbl_map(function(value) + local new_val = { + icon = value.icon, + -- one of color or cterm_color should be present, and we will derive + -- everything to the `color` field to prevent lots of color translating + color = value.color and darken_color(value.color) or value.cterm_color and darken_color( + cterm_to_rgb(value.cterm_color) + ) or nil, + name = value.name, + } + return new_val + end, global_opts.override) else theme = require "nvim-web-devicons.icons-default" + overrides = global_opts.override + -- populate `color` field if only `cterm_color` is present + vim.tbl_map(function(value) + if not value.color and value.cterm_color then + value.color = cterm_to_rgb(value.cterm_color) + end + end, overrides) end icons_by_filename = theme.icons_by_filename icons_by_file_extension = theme.icons_by_file_extension icons_by_operating_system = theme.icons_by_operating_system icons = vim.tbl_extend("keep", {}, icons_by_filename, icons_by_file_extension, icons_by_operating_system) - icons = vim.tbl_extend("force", icons, global_opts.override) + icons = vim.tbl_extend("force", icons, overrides) end -- Map of filetypes -> icon names