From 7460fe5aa20e751802b15185e273ddfa1b9c953d Mon Sep 17 00:00:00 2001 From: Shadman Date: Fri, 8 Jan 2021 07:35:09 +0600 Subject: [PATCH] Added notermguicolor support and special effects (#27) * Added notermguicolor support and special effects * Added notermgui support * Exposed special parameters for highlight(like bold,italic) to themes with gui like to bold "B" in normal mode do normal.b.gui = 'bold' * Changed CONTRIBUTING.md to reflect current notermguicolor support * Added calculating cterm values from rgb * refactored highlight function * Removed 'bold' default for a element * Updated themes * Adding function genarated cterm values to themes * Updating CONTRIBUTING.md * made colorschemes more compact Co-authored-by: hoob3rt --- CONTRIBUTING.md | 123 ++++-------- lua/lualine/highlight.lua | 22 +-- lua/lualine/themes/dracula.lua | 128 ++++-------- lua/lualine/themes/forest_night.lua | 125 +++--------- lua/lualine/themes/gruvbox.lua | 130 ++++-------- lua/lualine/themes/nord.lua | 85 +++----- lua/lualine/themes/onedark.lua | 118 +++-------- lua/lualine/themes/powerline.lua | 106 ++++------ lua/lualine/utils.lua | 297 ++++++++++++++++++++++++++++ 9 files changed, 536 insertions(+), 598 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2bd5b02..723883f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -18,117 +18,74 @@ theme example To create a custom theme you need to define a colorscheme for each of vim's modes. Each mode has a `fg` and `bg` field for every lualine section. -This is really easy in lua. Here is and example of a gruvbox theme. +You can add special effects with `gui`. +You can provide colors in two ways + 1. As a table like `{'hexcode', 256_color_code}` + 2. As a String like `'hexcode'` +Note : You can use `lualine.util.get_cterm_color(hex_color)` function to genarate 256_color_codes from hex_codes. + When method 2 is used 256_color_codes are genarated with that . + +Adding theme is really easy in lua. Here is and example of a gruvbox theme. ```lua local gruvbox = { } local colors = { - black = "#282828", - white = '#ebdbb2', - red = '#fb4934', - green = '#b8bb26', - blue = '#83a598', - yellow = '#fe8019', + -- color format { hex_color, 256_color_code} + black = {"#282828", 235}, + white = {'#ebdbb2', 223}, + red = {'#fb4934', 203}, + green = {'#b8bb26', 143}, + blue = {'#83a598', 108}, + yellow = {'#fe8019', 209}, - gray = '#a89984', - darkgray = '#3c3836', - - lightgray = '#504945', + -- color format 'hex_color' + gray = '#a89984', + darkgray = '#3c3836', + lightgray = '#504945', inactivegray = '#7c6f64', } gruvbox.normal = { - a = { - bg = colors.gray, - fg = colors.black, - }, - b = { - bg = colors.lightgray, - fg = colors.white, - }, - c = { - bg = colors.darkgray, - fg = colors.gray - } + -- gui parameter is optional and behaves the same way as in vim's highlight command + a = { bg = colors.gray, fg = colors.black, gui = "bold", }, + b = { bg = colors.lightgray, fg = colors.white, }, + c = { bg = colors.darkgray, fg = colors.gray } } gruvbox.insert = { - a = { - bg = colors.blue, - fg = colors.black, - }, - b = { - bg = colors.lightgray, - fg = colors.white, - }, - c = { - bg = colors.lightgray, - fg = colors.white - } + a = { bg = colors.blue, fg = colors.black, gui = "bold", }, + b = { bg = colors.lightgray, fg = colors.white, }, + c = { bg = colors.lightgray, fg = colors.white } } gruvbox.visual = { - a = { - bg = colors.yellow, - fg = colors.black, - }, - b = { - bg = colors.lightgray, - fg = colors.white, - }, - c = { - bg = colors.inactivegray, - fg = colors.black - }, + a = { bg = colors.yellow, fg = colors.black, gui = "bold", }, + b = { bg = colors.lightgray, fg = colors.white, }, + c = { bg = colors.inactivegray, fg = colors.black }, } gruvbox.replace = { - a = { - bg = colors.red, - fg = colors.black, - }, - b = { - bg = colors.lightgray, - fg = colors.white, - }, - c = { - bg = colors.black, - fg = colors.white - }, + a = { bg = colors.red, fg = colors.black, gui = "bold", }, + b = { bg = colors.lightgray, fg = colors.white, }, + c = { bg = colors.black, fg = colors.white }, } gruvbox.command = { - a = { - bg = colors.green, - fg = colors.black, - }, - b = { - bg = colors.lightgray, - fg = colors.white, - }, - c = { - bg = colors.inactivegray, - fg = colors.black - }, + a = { bg = colors.green, fg = colors.black, gui = "bold", }, + b = { bg = colors.lightgray, fg = colors.white, }, + c = { bg = colors.inactivegray, fg = colors.black }, } +-- you can assign one colorscheme to another, if a colorscheme is +-- undefined it falls back to normal gruvbox.terminal = gruvbox.normal gruvbox.inactive = { - a = { - bg = colors.darkgray, - fg = colors.gray, - }, - b = { - bg = colors.darkgray, - fg = colors.gray, - }, - c = { - bg = colors.darkgray, - fg = colors.gray - }, + a = { bg = colors.darkgray, fg = colors.gray, gui = "bold", }, + b = { bg = colors.darkgray, fg = colors.gray, }, + c = { bg = colors.darkgray, fg = colors.gray }, } lualine.theme = gruvbox diff --git a/lua/lualine/highlight.lua b/lua/lualine/highlight.lua index 532663f..03b6265 100644 --- a/lua/lualine/highlight.lua +++ b/lua/lualine/highlight.lua @@ -1,12 +1,16 @@ local M = { } +local utils = require "lualine.utils" -local function highlight (name, foreground, background, special) +local function highlight (name, foreground, background, gui) local command = { - 'highlight', name, - 'guifg=' .. foreground, - 'guibg=' .. background, - 'gui=' .. (special or 'none'), - } + 'highlight', name, + 'ctermfg=' .. (foreground[2] or utils.get_cterm_color(foreground)), + 'ctermbg=' .. (background[2] or utils.get_cterm_color(background)), + 'cterm=' .. (gui or 'none'), + 'guifg=' .. (foreground[1] or foreground), + 'guibg=' .. (background[1] or background), + 'gui=' .. (gui or 'none'), + } return table.concat(command, ' ') end @@ -28,12 +32,8 @@ function M.create_highlight_groups(theme) apply_defaults_to_theme(theme) for mode, sections in pairs(theme) do for section, colorscheme in pairs(sections) do - local special = nil - if section == 'a' then - special = 'bold' - end local highlight_group_name = { 'lualine', section, mode } - vim.cmd(highlight(table.concat(highlight_group_name, '_'), colorscheme.fg, colorscheme.bg, special)) + vim.cmd(highlight(table.concat(highlight_group_name, '_'), colorscheme.fg, colorscheme.bg, colorscheme.gui)) end end end diff --git a/lua/lualine/themes/dracula.lua b/lua/lualine/themes/dracula.lua index c385080..5545f1d 100644 --- a/lua/lualine/themes/dracula.lua +++ b/lua/lualine/themes/dracula.lua @@ -1,109 +1,51 @@ -local M = { } +local dracula = {} local colors = { - grey = "#44475a", - light_gray = "#5f6a8e", - orange = "#ffb86c", - purple = "#bd93f9", - red = "#ff5555", - yellow = "#f1fa8c", - green = "#50fa7b", - - white = "#f8f8f2", - black = "#282a36", + grey = {"#44475a", 238}, + light_gray = {"#5f6a8e", 60 }, + orange = {"#ffb86c", 215}, + purple = {"#bd93f9", 141}, + red = {"#ff5555", 203}, + yellow = {"#f1fa8c", 228}, + green = {"#50fa7b", 84 }, + white = {"#f8f8f2", 255}, + black = {"#282a36", 236}, } -M.normal = { - a = { - bg = colors.purple, - fg = colors.black, - }, - b = { - bg = colors.light_gray, - fg = colors.white, - }, - c = { - bg = colors.grey, - fg = colors.white, - } +dracula.normal = { + a = { bg = colors.purple, fg = colors.black, gui = 'bold', }, + b = { bg = colors.light_gray, fg = colors.white, }, + c = { bg = colors.grey, fg = colors.white, } } -M.insert = { - a = { - bg = colors.green, - fg = colors.black, - }, - b = { - bg = colors.light_gray, - fg = colors.white, - }, - c = { - bg = colors.grey, - fg = colors.white, - } +dracula.insert = { + a = { bg = colors.green, fg = colors.black, gui = 'bold', }, + b = { bg = colors.light_gray, fg = colors.white, }, + c = { bg = colors.grey, fg = colors.white, } } - -M.visual = { - a = { - bg = colors.yellow, - fg = colors.black, - }, - b = { - bg = colors.light_gray, - fg = colors.white, - }, - c = { - bg = colors.grey, - fg = colors.white, - }, +dracula.visual = { + a = { bg = colors.yellow, fg = colors.black, gui = 'bold', }, + b = { bg = colors.light_gray, fg = colors.white, }, + c = { bg = colors.grey, fg = colors.white, }, } -M.replace = { - a = { - bg = colors.red, - fg = colors.black, - }, - b = { - bg = colors.light_gray, - fg = colors.white, - }, - c = { - bg = colors.grey, - fg = colors.white, - }, +dracula.replace = { + a = { bg = colors.red, fg = colors.black, gui = 'bold', }, + b = { bg = colors.light_gray, fg = colors.white, }, + c = { bg = colors.grey, fg = colors.white, }, } -M.command = { - a = { - bg = colors.grey, - fg = colors.white, - }, - b = { - bg = colors.light_gray, - fg = colors.white, - }, - c = { - bg = colors.purple, - fg = colors.white - }, +dracula.command = { + a = { bg = colors.grey, fg = colors.white, gui = 'bold', }, + b = { bg = colors.light_gray, fg = colors.white, }, + c = { bg = colors.purple, fg = colors.white }, } -M.terminal = M.normal - -M.inactive = { - a = { - bg = colors.white, - fg = colors.purple, - }, - b = { - bg = colors.grey, - fg = colors.purple, - }, - c = { - bg = colors.purple, - fg = colors.purple, - }, +dracula.inactive = { + a = { bg = colors.white, fg = colors.purple, gui = 'bold', }, + b = { bg = colors.grey, fg = colors.purple, }, + c = { bg = colors.purple, fg = colors.purple, }, } -return M +return dracula diff --git a/lua/lualine/themes/forest_night.lua b/lua/lualine/themes/forest_night.lua index 892aed5..c4ff70b 100644 --- a/lua/lualine/themes/forest_night.lua +++ b/lua/lualine/themes/forest_night.lua @@ -1,121 +1,58 @@ local forest_night = {} local colors = { - bg0 = "#323d43", - bg1 = "#3c474d", - bg3 = "#505a60", - fg = "#d8caac", - aqua = "#87c095", - green = "#a7c080", - orange = "#e39b7b", - purple = "#d39bb6", - red = "#e68183", - grey1 = "#868d80", + bg0 = {"#323d43", 237}, + bg1 = {"#3c474d", 238}, + bg3 = {"#505a60", 240}, + fg = {"#d8caac", 187}, + aqua = {"#87c095", 108}, + green = {"#a7c080", 144}, + orange = {"#e39b7b", 180}, + purple = {"#d39bb6", 181}, + red = {"#e68183", 174}, + grey1 = {"#868d80", 102}, } forest_night.normal = { - a = { - bg = colors.green, - fg = colors.bg0, - }, - b = { - bg = colors.bg3, - fg = colors.fg, - }, - c = { - bg = colors.bg1, - fg = colors.fg, - }, + a = { bg = colors.green, fg = colors.bg0, gui = 'bold', }, + b = { bg = colors.bg3, fg = colors.fg, }, + c = { bg = colors.bg1, fg = colors.fg, }, } forest_night.insert = { - a = { - bg = colors.fg, - fg = colors.bg0, - }, - b = { - bg = colors.bg3, - fg = colors.fg, - }, - c = { - bg = colors.bg1, - fg = colors.fg, - }, + a = { bg = colors.fg, fg = colors.bg0, gui = 'bold', }, + b = { bg = colors.bg3, fg = colors.fg, }, + c = { bg = colors.bg1, fg = colors.fg, }, } forest_night.visual = { - a = { - bg = colors.red, - fg = colors.bg0, - }, - b = { - bg = colors.bg3, - fg = colors.fg, - }, - c = { - bg = colors.bg1, - fg = colors.fg, - }, + a = { bg = colors.red, fg = colors.bg0, gui = 'bold', }, + b = { bg = colors.bg3, fg = colors.fg, }, + c = { bg = colors.bg1, fg = colors.fg, }, } forest_night.replace = { - a = { - bg = colors.orange, - fg = colors.bg0, - }, - b = { - bg = colors.bg3, - fg = colors.fg, - }, - c = { - bg = colors.bg1, - fg = colors.fg, - }, + a = { bg = colors.orange, fg = colors.bg0, gui = 'bold', }, + b = { bg = colors.bg3, fg = colors.fg, }, + c = { bg = colors.bg1, fg = colors.fg, }, } forest_night.command = { - a = { - bg = colors.aqua, - fg = colors.bg0, - }, - b = { - bg = colors.bg3, - fg = colors.fg, - }, - c = { - bg = colors.bg1, - fg = colors.fg, - }, + a = { bg = colors.aqua, fg = colors.bg0, gui = 'bold', }, + b = { bg = colors.bg3, fg = colors.fg, }, + c = { bg = colors.bg1, fg = colors.fg, }, } forest_night.terminal = { - a = { - bg = colors.purple, - fg = colors.bg0, - }, - b = { - bg = colors.bg3, - fg = colors.fg, - }, - c = { - bg = colors.bg1, - fg = colors.fg, - }, + a = { bg = colors.purple, fg = colors.bg0, gui = 'bold', }, + b = { bg = colors.bg3, fg = colors.fg, }, + c = { bg = colors.bg1, fg = colors.fg, }, } forest_night.inactive = { - a = { - bg = colors.bg1, - fg = colors.grey1, - }, - b = { - bg = colors.bg1, - fg = colors.grey1, - }, - c = { - bg = colors.bg1, - fg = colors.grey1, - }, + a = { bg = colors.bg1, fg = colors.grey1, gui = 'bold', }, + b = { bg = colors.bg1, fg = colors.grey1, }, + c = { bg = colors.bg1, fg = colors.grey1, }, } return forest_night diff --git a/lua/lualine/themes/gruvbox.lua b/lua/lualine/themes/gruvbox.lua index 68649d8..2cfb452 100644 --- a/lua/lualine/themes/gruvbox.lua +++ b/lua/lualine/themes/gruvbox.lua @@ -1,111 +1,53 @@ -local M = { } +local gruvbox = {} local colors = { - black = "#282828", - white = '#ebdbb2', - red = '#fb4934', - green = '#b8bb26', - blue = '#83a598', - yellow = '#fe8019', - - gray = '#a89984', - darkgray = '#3c3836', - - lightgray = '#504945', - inactivegray = '#7c6f64', + black = {"#282828", 235}, + white = {'#ebdbb2', 223}, + red = {'#fb4934', 203}, + green = {'#b8bb26', 143}, + blue = {'#83a598', 108}, + yellow = {'#fe8019', 209}, + gray = {'#a89984', 144}, + darkgray = {'#3c3836', 237}, + lightgray = {'#504945', 239}, + inactivegray = {'#7c6f64', 242}, } -M.normal = { - a = { - bg = colors.gray, - fg = colors.black, - }, - b = { - bg = colors.lightgray, - fg = colors.white, - }, - c = { - bg = colors.darkgray, - fg = colors.gray - } +gruvbox.normal = { + a = { bg = colors.gray, fg = colors.black, gui = 'bold', }, + b = { bg = colors.lightgray, fg = colors.white, }, + c = { bg = colors.darkgray, fg = colors.gray } } -M.insert = { - a = { - bg = colors.blue, - fg = colors.black, - }, - b = { - bg = colors.lightgray, - fg = colors.white, - }, - c = { - bg = colors.lightgray, - fg = colors.white - } +gruvbox.insert = { + a = { bg = colors.blue, fg = colors.black, gui = 'bold', }, + b = { bg = colors.lightgray, fg = colors.white, }, + c = { bg = colors.lightgray, fg = colors.white } } -M.visual = { - a = { - bg = colors.yellow, - fg = colors.black, - }, - b = { - bg = colors.lightgray, - fg = colors.white, - }, - c = { - bg = colors.inactivegray, - fg = colors.black - }, +gruvbox.visual = { + a = { bg = colors.yellow, fg = colors.black, gui = 'bold', }, + b = { bg = colors.lightgray, fg = colors.white, }, + c = { bg = colors.inactivegray, fg = colors.black }, } -M.replace = { - a = { - bg = colors.red, - fg = colors.black, - }, - b = { - bg = colors.lightgray, - fg = colors.white, - }, - c = { - bg = colors.black, - fg = colors.white - }, +gruvbox.replace = { + a = { bg = colors.red, fg = colors.black, gui = 'bold', }, + b = { bg = colors.lightgray, fg = colors.white, }, + c = { bg = colors.black, fg = colors.white }, } -M.command = { - a = { - bg = colors.green, - fg = colors.black, - }, - b = { - bg = colors.lightgray, - fg = colors.white, - }, - c = { - bg = colors.inactivegray, - fg = colors.black - }, +gruvbox.command = { + a = { bg = colors.green, fg = colors.black, gui = 'bold', }, + b = { bg = colors.lightgray, fg = colors.white, }, + c = { bg = colors.inactivegray, fg = colors.black }, } -M.terminal = M.normal - -M.inactive = { - a = { - bg = colors.darkgray, - fg = colors.gray, - }, - b = { - bg = colors.darkgray, - fg = colors.gray, - }, - c = { - bg = colors.darkgray, - fg = colors.gray - }, +gruvbox.inactive = { + a = { bg = colors.darkgray, fg = colors.gray, gui = 'bold', }, + b = { bg = colors.darkgray, fg = colors.gray, }, + c = { bg = colors.darkgray, fg = colors.gray }, } -return M +return gruvbox diff --git a/lua/lualine/themes/nord.lua b/lua/lualine/themes/nord.lua index 892377a..334257f 100644 --- a/lua/lualine/themes/nord.lua +++ b/lua/lualine/themes/nord.lua @@ -1,76 +1,37 @@ -local M = { } +local nord = {} local colors = { - nord1 = "#3B4252", - nord3 = "#4C566A", - nord5 = "#E5E9F0", - nord6 = "#ECEFF4", - nord7 = "#8FBCBB", - nord8 = "#88C0D0", - nord13 = "#EBCB8B", - + nord1 = {"#3B4252", 237}, + nord3 = {"#4C566A", 240}, + nord5 = {"#E5E9F0", 254}, + nord6 = {"#ECEFF4", 255}, + nord7 = {"#8FBCBB", 158}, + nord8 = {"#88C0D0", 159}, + nord13 = {"#EBCB8B", 221}, } -M.normal = { - a = { - fg = colors.nord1, - bg = colors.nord8, - }, - b = { - fg = colors.nord5, - bg = colors.nord1, - }, - c = { - fg = colors.nord5, - bg = colors.nord3, - } +nord.normal = { + a = { fg = colors.nord1, bg = colors.nord8, gui = 'bold', }, + b = { fg = colors.nord5, bg = colors.nord1, }, + c = { fg = colors.nord5, bg = colors.nord3, } } -M.insert = { - a = { - fg = colors.nord1, - bg = colors.nord6, - }, - b = M.normal.b, - c = M.normal.c, +nord.insert = { + a = { fg = colors.nord1, bg = colors.nord6, gui = 'bold', }, } - -M.visual = { - a = { - fg = colors.nord1, - bg = colors.nord7, - }, - b = M.normal.b, - c = M.normal.c, +nord.visual = { + a = { fg = colors.nord1, bg = colors.nord7, gui = 'bold', }, } -M.replace = { - a = { - fg = colors.nord1, - bg = colors.nord13, - }, - b = M.normal.b, - c = M.normal.c, +nord.replace = { + a = { fg = colors.nord1, bg = colors.nord13, gui = 'bold', }, } -M.command = M.normal - -M.terminal = M.normal - -M.inactive = { - a = { - fg = colors.nord1, - bg = colors.nord8, - }, - b = { - fg = colors.nord5, - bg = colors.nord1, - }, - c = { - fg = colors.nord5, - bg = colors.nord1, - }, +nord.inactive = { + a = { fg = colors.nord1, bg = colors.nord8, gui = 'bold', }, + b = { fg = colors.nord5, bg = colors.nord1, }, + c = { fg = colors.nord5, bg = colors.nord1, }, } -return M +return nord diff --git a/lua/lualine/themes/onedark.lua b/lua/lualine/themes/onedark.lua index aee6df3..f367207 100644 --- a/lua/lualine/themes/onedark.lua +++ b/lua/lualine/themes/onedark.lua @@ -1,102 +1,44 @@ -local M = { } +local onedark = {} local colors = { - red = "#E06C75", - dark_red = "#BE5046", - green = "#98C379", - yellow = "#E5C07B", - dark_yellow = "#D19A66", - blue = "#61AFEF", - purple = "#C678DD", - cyan = "#56B6C2", - white = "#ABB2BF", - black = "#282C34", - visual_black = "NONE", - comment_grey = "#5C6370", - gutter_fg_grey = "#4B5263", - cursor_grey = "#2C323C", - visual_grey = "#3E4452", - menu_grey = "#3E4452", - special_grey = "#3B4048", - vertsplit = "#181A1F", + red = {"#E06C75", 168}, + dark_red = {"#BE5046", 131}, + green = {"#98C379", 114}, + blue = {"#61AFEF", 75 }, + purple = {"#C678DD", 176}, + white = {"#ABB2BF", 249}, + black = {"#282C34", 236}, + visual_grey = {"#3E4452", 238}, } -M.normal = { - a = { - fg = colors.black, - bg = colors.green, - }, - b = { - fg = colors.white, - bg = colors.visual_grey, - }, - c = { - fg = colors.green, - bg = colors.black, - }, +onedark.normal = { + a = { fg = colors.black, bg = colors.green, gui = 'bold', }, + b = { fg = colors.white, bg = colors.visual_grey, }, + c = { fg = colors.green, bg = colors.black, }, } -M.insert = { - a = { - fg = colors.black, - bg = colors.blue, - }, - b = { - fg = colors.white, - bg = colors.visual_grey, - }, - c = { - fg = colors.blue, - bg = colors.black, - }, +onedark.insert = { + a = { fg = colors.black, bg = colors.blue, gui = 'bold', }, + b = { fg = colors.white, bg = colors.visual_grey, }, + c = { fg = colors.blue, bg = colors.black, }, } -M.visual = { - a = { - fg = colors.black, - bg = colors.purple, - }, - b = { - fg = colors.white, - bg = colors.visual_grey, - }, - c = { - fg = colors.purple, - bg = colors.black, - }, +onedark.visual = { + a = { fg = colors.black, bg = colors.purple, gui = 'bold', }, + b = { fg = colors.white, bg = colors.visual_grey, }, + c = { fg = colors.purple, bg = colors.black, }, } -M.replace = { - a = { - fg = colors.black, - bg = colors.red, - }, - b = { - fg = colors.white, - bg = colors.visual_grey, - }, - c = { - fg = colors.red, - bg = colors.black, - }, +onedark.replace = { + a = { fg = colors.black, bg = colors.red, gui = 'bold', }, + b = { fg = colors.white, bg = colors.visual_grey, }, + c = { fg = colors.red, bg = colors.black, }, } -M.terminal = M.normal -M.command = M.normal - -M.inactive = { - a = { - fg = colors.black, - bg = colors.white, - }, - b = { - fg = colors.white, - bg = colors.visual_grey, - }, - c = { - fg = colors.white, - bg = colors.visual_grey, - }, +onedark.inactive = { + a = { fg = colors.black, bg = colors.white, gui = 'bold', }, + b = { fg = colors.white, bg = colors.visual_grey, }, + c = { fg = colors.white, bg = colors.visual_grey, }, } -return M +return onedark diff --git a/lua/lualine/themes/powerline.lua b/lua/lualine/themes/powerline.lua index 25ceac9..5fbb558 100644 --- a/lua/lualine/themes/powerline.lua +++ b/lua/lualine/themes/powerline.lua @@ -1,88 +1,48 @@ -local M = { } +local powerline = { } local Colors = { - white = '#ffffff', - darkestgreen = '#005f00', - brightgreen = '#afdf00', - darkestcyan = '#005f5f', - mediumcyan = '#87dfff', - darkestblue = '#005f87', - darkred = '#870000', - brightred = '#df0000', - brightorange = '#ff8700', - gray1 = '#262626', - gray2 = '#303030', - gray4 = '#585858', - gray5 = '#606060', - gray7 = '#9e9e9e', - gray10 = '#f0f0f0', + white = {'#ffffff', 231}, + darkestgreen = {'#005f00', 22 }, + brightgreen = {'#afdf00', 148}, + darkestcyan = {'#005f5f', 23 }, + mediumcyan = {'#87dfff', 117}, + darkestblue = {'#005f87', 24 }, + darkred = {'#870000', 88 }, + brightred = {'#df0000', 160}, + brightorange = {'#ff8700', 214}, + gray1 = {'#262626', 235}, + gray2 = {'#303030', 236}, + gray4 = {'#585858', 240}, + gray5 = {'#606060', 241}, + gray7 = {'#9e9e9e', 245}, + gray10 = {'#f0f0f0', 252}, } -M.normal = { - a = { - fg = Colors.darkestgreen, - bg = Colors.brightgreen, - }, - b = { - fg = Colors.gray10, - bg = Colors.gray5, - }, - c = { - fg = Colors.gray7, - bg = Colors.gray2, - }, +powerline.normal = { + a = { fg = Colors.darkestgreen, bg = Colors.brightgreen, gui = 'bold', }, + b = { fg = Colors.gray10, bg = Colors.gray5, }, + c = { fg = Colors.gray7, bg = Colors.gray2, }, } -M.insert = { - a = { - fg = Colors.darkestcyan, - bg = Colors.white, - }, - b = { - fg = Colors.darkestcyan, - bg = Colors.mediumcyan, - }, - c = { - fg = Colors.mediumcyan, - bg = Colors.darkestblue, - }, +powerline.insert = { + a = { fg = Colors.darkestcyan, bg = Colors.white, gui = 'bold', }, + b = { fg = Colors.darkestcyan, bg = Colors.mediumcyan, }, + c = { fg = Colors.mediumcyan, bg = Colors.darkestblue, }, } -M.visual = { - a = { - fg = Colors.darkred, - bg = Colors.brightorange, - }, - b = M.normal.b, - c = M.normal.c, +powerline.visual = { + a = { fg = Colors.darkred, bg = Colors.brightorange, gui = 'bold', }, } -M.replace = { - a = { - fg = Colors.white, - bg = Colors.brightred, - }, - b = M.normal.b, - c = M.normal.c, +powerline.replace = { + a = { fg = Colors.white, bg = Colors.brightred, gui = 'bold', }, } -M.command = M.normal -M.terminal = M.normal - -M.inactive = { - a = { - fg = Colors.gray1, - bg = Colors.gray5, - }, - b = { - fg = Colors.gray1, - bg = Colors.gray5, - }, - c = { - bg = Colors.gray1, - fg = Colors.gray5, - }, +powerline.inactive = { + a = { fg = Colors.gray1, bg = Colors.gray5, gui = 'bold', }, + b = { fg = Colors.gray1, bg = Colors.gray5, }, + c = { bg = Colors.gray1, fg = Colors.gray5, }, } -return M +return powerline diff --git a/lua/lualine/utils.lua b/lua/lualine/utils.lua index 48c520d..f2e45ca 100644 --- a/lua/lualine/utils.lua +++ b/lua/lualine/utils.lua @@ -18,4 +18,301 @@ function M.draw_section(section, separator) return ' ' .. table.concat(status, sep) .. ' ' end +-- color conversion +local color_table = { + -- lookup table for cterm colors + -- format {'color_code', {r,g,b}} + + -- Primary 3-bit (8 colors). Unique representation! + {'00', { 0, 0, 0 }}, + {'01', { 128, 0, 0 }}, + {'02', { 0, 128, 0 }}, + {'03', { 128, 128, 0 }}, + {'04', { 0, 0, 128 }}, + {'05', { 128, 0, 128 }}, + {'06', { 0, 128, 128 }}, + {'07', { 192, 192, 192 }}, + + -- equivalent "bright" versions of original 8 colors. + {'08', { 128, 128, 128 }}, + {'09', { 255, 0, 0 }}, + {'10', { 0, 255, 0 }}, + {'11', { 255, 255, 0 }}, + {'12', { 0, 0, 255 }}, + {'13', { 255, 0, 255 }}, + {'14', { 0, 255, 255 }}, + {'15', { 255, 255, 255 }}, + + -- Strictly ascending. + {'16', { 0, 0, 0 }}, + {'17', { 0, 0, 95 }}, + {'18', { 0, 0, 135 }}, + {'19', { 0, 0, 175 }}, + {'20', { 0, 0, 215 }}, + {'21', { 0, 0, 255 }}, + {'22', { 0, 95, 0 }}, + {'23', { 0, 95, 95 }}, + {'24', { 0, 95, 135 }}, + {'25', { 0, 95, 175 }}, + {'26', { 0, 95, 215 }}, + {'27', { 0, 95, 255 }}, + {'28', { 0, 135, 0 }}, + {'29', { 0, 135, 95 }}, + {'30', { 0, 135, 135 }}, + {'31', { 0, 135, 175 }}, + {'32', { 0, 135, 215 }}, + {'33', { 0, 135, 255 }}, + {'34', { 0, 175, 0 }}, + {'35', { 0, 175, 95 }}, + {'36', { 0, 175, 135 }}, + {'37', { 0, 175, 175 }}, + {'38', { 0, 175, 215 }}, + {'39', { 0, 175, 255 }}, + {'40', { 0, 215, 0 }}, + {'41', { 0, 215, 95 }}, + {'42', { 0, 215, 135 }}, + {'43', { 0, 215, 175 }}, + {'44', { 0, 215, 215 }}, + {'45', { 0, 215, 255 }}, + {'46', { 0, 255, 0 }}, + {'47', { 0, 255, 95 }}, + {'48', { 0, 255, 135 }}, + {'49', { 0, 255, 175 }}, + {'50', { 0, 255, 215 }}, + {'51', { 0, 255, 255 }}, + {'52', { 95, 0, 0 }}, + {'53', { 95, 0, 95 }}, + {'54', { 95, 0, 135 }}, + {'55', { 95, 0, 175 }}, + {'56', { 95, 0, 215 }}, + {'57', { 95, 0, 255 }}, + {'58', { 95, 95, 0 }}, + {'59', { 95, 95, 95 }}, + {'60', { 95, 95, 135 }}, + {'61', { 95, 95, 175 }}, + {'62', { 95, 95, 215 }}, + {'63', { 95, 95, 255 }}, + {'64', { 95, 135, 0 }}, + {'65', { 95, 135, 95 }}, + {'66', { 95, 135, 135 }}, + {'67', { 95, 135, 175 }}, + {'68', { 95, 135, 215 }}, + {'69', { 95, 135, 255 }}, + {'70', { 95, 175, 0 }}, + {'71', { 95, 175, 95 }}, + {'72', { 95, 175, 135 }}, + {'73', { 95, 175, 175 }}, + {'74', { 95, 175, 215 }}, + {'75', { 95, 175, 255 }}, + {'76', { 95, 215, 0 }}, + {'77', { 95, 215, 95 }}, + {'78', { 95, 215, 135 }}, + {'79', { 95, 215, 175 }}, + {'80', { 95, 215, 215 }}, + {'81', { 95, 215, 255 }}, + {'82', { 95, 255, 0 }}, + {'83', { 95, 255, 95 }}, + {'84', { 95, 255, 135 }}, + {'85', { 95, 255, 175 }}, + {'86', { 95, 255, 215 }}, + {'87', { 95, 255, 255 }}, + {'88', { 135, 0, 0 }}, + {'89', { 135, 0, 95 }}, + {'90', { 135, 0, 135 }}, + {'91', { 135, 0, 175 }}, + {'92', { 135, 0, 215 }}, + {'93', { 135, 0, 255 }}, + {'94', { 135, 95, 0 }}, + {'95', { 135, 95, 95 }}, + {'96', { 135, 95, 135 }}, + {'97', { 135, 95, 175 }}, + {'98', { 135, 95, 215 }}, + {'99', { 135, 95, 255 }}, + {'100', { 135, 135, 0 }}, + {'101', { 135, 135, 95 }}, + {'102', { 135, 135, 135 }}, + {'103', { 135, 135, 175 }}, + {'104', { 135, 135, 215 }}, + {'105', { 135, 135, 255 }}, + {'106', { 135, 175, 0 }}, + {'107', { 135, 175, 95 }}, + {'108', { 135, 175, 135 }}, + {'109', { 135, 175, 175 }}, + {'110', { 135, 175, 215 }}, + {'111', { 135, 175, 255 }}, + {'112', { 135, 215, 0 }}, + {'113', { 135, 215, 95 }}, + {'114', { 135, 215, 135 }}, + {'115', { 135, 215, 175 }}, + {'116', { 135, 215, 215 }}, + {'117', { 135, 215, 255 }}, + {'118', { 135, 255, 0 }}, + {'119', { 135, 255, 95 }}, + {'120', { 135, 255, 135 }}, + {'121', { 135, 255, 175 }}, + {'122', { 135, 255, 215 }}, + {'123', { 135, 255, 255 }}, + {'124', { 175, 0, 0 }}, + {'125', { 175, 0, 95 }}, + {'126', { 175, 0, 135 }}, + {'127', { 175, 0, 175 }}, + {'128', { 175, 0, 215 }}, + {'129', { 175, 0, 255 }}, + {'130', { 175, 95, 0 }}, + {'131', { 175, 95, 95 }}, + {'132', { 175, 95, 135 }}, + {'133', { 175, 95, 175 }}, + {'134', { 175, 95, 215 }}, + {'135', { 175, 95, 255 }}, + {'136', { 175, 135, 0 }}, + {'137', { 175, 135, 95 }}, + {'138', { 175, 135, 135 }}, + {'139', { 175, 135, 175 }}, + {'140', { 175, 135, 215 }}, + {'141', { 175, 135, 255 }}, + {'142', { 175, 175, 0 }}, + {'143', { 175, 175, 95 }}, + {'144', { 175, 175, 135 }}, + {'145', { 175, 175, 175 }}, + {'146', { 175, 175, 215 }}, + {'147', { 175, 175, 255 }}, + {'148', { 175, 215, 0 }}, + {'149', { 175, 215, 95 }}, + {'150', { 175, 215, 135 }}, + {'151', { 175, 215, 175 }}, + {'152', { 175, 215, 215 }}, + {'153', { 175, 215, 255 }}, + {'154', { 175, 255, 0 }}, + {'155', { 175, 255, 95 }}, + {'156', { 175, 255, 135 }}, + {'157', { 175, 255, 175 }}, + {'158', { 175, 255, 215 }}, + {'159', { 175, 255, 255 }}, + {'160', { 215, 0, 0 }}, + {'161', { 215, 0, 95 }}, + {'162', { 215, 0, 135 }}, + {'163', { 215, 0, 175 }}, + {'164', { 215, 0, 215 }}, + {'165', { 215, 0, 255 }}, + {'166', { 215, 95, 0 }}, + {'167', { 215, 95, 95 }}, + {'168', { 215, 95, 135 }}, + {'169', { 215, 95, 175 }}, + {'170', { 215, 95, 215 }}, + {'171', { 215, 95, 255 }}, + {'172', { 215, 135, 0 }}, + {'173', { 215, 135, 95 }}, + {'174', { 215, 135, 135 }}, + {'175', { 215, 135, 175 }}, + {'176', { 215, 135, 215 }}, + {'177', { 215, 135, 255 }}, + {'178', { 215, 175, 0 }}, + {'179', { 215, 175, 95 }}, + {'180', { 215, 175, 135 }}, + {'181', { 215, 175, 175 }}, + {'182', { 215, 175, 215 }}, + {'183', { 215, 175, 255 }}, + {'184', { 215, 215, 0 }}, + {'185', { 215, 215, 95 }}, + {'186', { 215, 215, 135 }}, + {'187', { 215, 215, 175 }}, + {'188', { 215, 215, 215 }}, + {'189', { 215, 215, 255 }}, + {'190', { 215, 255, 0 }}, + {'191', { 215, 255, 95 }}, + {'192', { 215, 255, 135 }}, + {'193', { 215, 255, 175 }}, + {'194', { 215, 255, 215 }}, + {'195', { 215, 255, 255 }}, + {'196', { 255, 0, 0 }}, + {'197', { 255, 0, 95 }}, + {'198', { 255, 0, 135 }}, + {'199', { 255, 0, 175 }}, + {'200', { 255, 0, 215 }}, + {'201', { 255, 0, 255 }}, + {'202', { 255, 95, 0 }}, + {'203', { 255, 95, 95 }}, + {'204', { 255, 95, 135 }}, + {'205', { 255, 95, 175 }}, + {'206', { 255, 95, 215 }}, + {'207', { 255, 95, 255 }}, + {'208', { 255, 135, 0 }}, + {'209', { 255, 135, 95 }}, + {'210', { 255, 135, 135 }}, + {'211', { 255, 135, 175 }}, + {'212', { 255, 135, 215 }}, + {'213', { 255, 135, 255 }}, + {'214', { 255, 175, 0 }}, + {'215', { 255, 175, 95 }}, + {'216', { 255, 175, 135 }}, + {'217', { 255, 175, 175 }}, + {'218', { 255, 175, 215 }}, + {'219', { 255, 175, 255 }}, + {'220', { 255, 215, 0 }}, + {'221', { 255, 215, 95 }}, + {'222', { 255, 215, 135 }}, + {'223', { 255, 215, 175 }}, + {'224', { 255, 215, 215 }}, + {'225', { 255, 215, 255 }}, + {'226', { 255, 255, 0 }}, + {'227', { 255, 255, 95 }}, + {'228', { 255, 255, 135 }}, + {'229', { 255, 255, 175 }}, + {'230', { 255, 255, 215 }}, + {'231', { 255, 255, 255 }}, + + -- Gray-scale range. + {'232', { 8, 8, 8 }}, + {'233', { 18, 18, 18 }}, + {'234', { 28, 28, 28 }}, + {'235', { 38, 38, 38 }}, + {'236', { 48, 48, 48 }}, + {'237', { 58, 58, 58 }}, + {'238', { 68, 68, 68 }}, + {'239', { 78, 78, 78 }}, + {'240', { 88, 88, 88 }}, + {'241', { 98, 98, 98 }}, + {'242', { 108, 108, 108 }}, + {'243', { 118, 118, 118 }}, + {'244', { 128, 128, 128 }}, + {'245', { 138, 138, 138 }}, + {'246', { 148, 148, 148 }}, + {'247', { 158, 158, 158 }}, + {'248', { 168, 168, 168 }}, + {'249', { 178, 178, 178 }}, + {'250', { 188, 188, 188 }}, + {'251', { 198, 198, 198 }}, + {'252', { 208, 208, 208 }}, + {'253', { 218, 218, 218 }}, + {'254', { 228, 228, 228 }}, + {'255', { 238, 238, 238 }}, +} + +function M.get_cterm_color(hex_color) + local function get_color_distance(color1, color2) + -- returns how much color2 deviates from color1 + local dr = math.abs(color1[1] - color2[1]) / (color1[1]+1) * 100 + local dg = math.abs(color1[2] - color2[2]) / (color1[2]+1) * 100 + local db = math.abs(color1[3] - color2[3]) / (color1[3]+1) * 100 + return (dr + dg + db) + end + + local r = tonumber(hex_color:sub(2,3), 16) + local g = tonumber(hex_color:sub(4,5), 16) + local b = tonumber(hex_color:sub(6,7), 16) + + -- check which cterm color is closest to hex colors in terms of rgb values + local closest_cterm_color = 0 + local min_distance = 10000 + for _, color in ipairs(color_table) do + local current_distance = get_color_distance(color[2], {r,g,b}) + if current_distance < min_distance then + min_distance = current_distance + closest_cterm_color = color[1] + end + end + return closest_cterm_color +end + + return M