diff --git a/README.md b/README.md index 65d6a7a..3d702ec 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,9 @@ use { ``` ## Usage and customization +Lualine can be configured with both lua and vimscript. +Click [here](#lua-config-example) if you want to see a config example in lua and [here](#vimscript-config-example) if you want to see a config example in vimscript. + Lualine has sections as shown below. ``` @@ -69,8 +72,6 @@ Lualine has sections as shown below. Each sections holds it's components e.g. current vim's mode. Colorscheme of sections is mirrored, meaning section `A` will have the same colorscheme as section `Z` etc. -Configuration is currently limited to lua, please use lua block or a separate lua file to configure lualine. - ### Starting lualine ```lua local lualine = require('lualine') @@ -131,17 +132,16 @@ lualine.inactive_sections = {
Available components -* general - * branch (git branch) - * diagnostics (diagnostics count from your prefered source) - * encoding (file encoding) - * fileformat (file format) - * filename - * filetype - * location (location in file in line:column format) - * mode (vim mode) - * progress (%progress in file) - * diff (git diff status) +* branch (git branch) +* diagnostics (diagnostics count from your prefered source) +* encoding (file encoding) +* fileformat (file format) +* filename +* filetype +* location (location in file in line:column format) +* mode (vim mode) +* progress (%progress in file) +* diff (git diff status)
@@ -165,7 +165,7 @@ lualine.sections.lualine_a = { hello } You can use vim functions as a lualine component -``` +```lua lualine.sections.lualine_b = { 'FugitiveHead' } ``` @@ -178,7 +178,7 @@ You can use variables from vim and lua globals as a lualine component Variables from g:, v:, t:, w:, b:, o, go:, vo:, to:, wo:, bo: scopes can be used. Scopes ending with o are options usualy accessed with `&` in vimscript -``` +```lua lualine.sections.lualine_b = { 'g:coc_status', 'bo:filetype' } ``` @@ -265,7 +265,7 @@ lualine.sections.lualine_b = { format = function(name) -- Capitalize first charecter of filename to capital. local path, fname = name:match('(.*/)(.*)') - if not path then path = ''; fname = name end + if not path then path = ''; fname = name end return path .. fname:sub(1, 1):upper() .. fname:sub(2, #fname) end } @@ -274,6 +274,33 @@ lualine.sections.lualine_b = { +### Using tabline as statusline +You can use lualine to display components in tabline . +The sections, configurations and highlights are same as statusline. + +``` +lualine.tabline = { + lualine_a = { }, + lualine_b = { 'branch' }, + lualine_c = { 'filename' }, + lualine_x = { }, + lualine_y = { }, + lualine_z = { }, +} +``` +This will show branch and filename component in top of neovim inside tabline . + + +You can also completely move your statuline to tabline by configuring lualine.tabline +instead of lualine.sections & lualine.inactive_sections and setting them to empty +``` +lualine.tabline = { +...... + } +lualine.sections = {} +lualine.inactive_sections = {} +``` + ### Loading plugin extensions Lualine extensions change statusline appearance for a window/buffer with a plugin loaded e.g. [junegunn/fzf.vim](https://github.com/junegunn/fzf.vim) @@ -284,7 +311,7 @@ lualine.extensions = { 'fzf' } All available extensions are listed in [EXTENSIONS.md](./EXTENSIONS.md) -### Full config example using [packer.nvim](https://github.com/wbthomason/packer.nvim) +### Lua config example
packer config @@ -294,69 +321,68 @@ All available extensions are listed in [EXTENSIONS.md](./EXTENSIONS.md) 'hoob3rt/lualine.nvim', requires = {'kyazdani42/nvim-web-devicons', opt = true}, config = function() - local lualine = require('lualine') - lualine.options = { - theme = 'gruvbox', - section_separators = {'', ''}, - component_separators = {'', ''}, - icons_enabled = true, + require('lualine').status{ + options = { + theme = 'gruvbox', + section_separators = {'', ''}, + component_separators = {'', ''}, + icons_enabled = true, + }, + sections = { + lualine_a = { {'mode', upper = true} }, + lualine_b = { {'branch', icon = ''} }, + lualine_c = { {'filename', file_status = true} }, + lualine_x = { 'encoding', 'fileformat', 'filetype' }, + lualine_y = { 'progress' }, + lualine_z = { 'location' }, + }, + inactive_sections = { + lualine_a = { }, + lualine_b = { }, + lualine_c = { 'filename' }, + lualine_x = { 'location' }, + lualine_y = { }, + lualine_z = { } + }, + extensions = { 'fzf' } } - lualine.sections = { - lualine_a = { 'mode' }, - lualine_b = { 'branch' }, - lualine_c = { 'filename' }, - lualine_x = { 'encoding', 'fileformat', 'filetype' }, - lualine_y = { 'progress' }, - lualine_z = { 'location' }, - } - lualine.inactive_sections = { - lualine_a = { }, - lualine_b = { }, - lualine_c = { 'filename' }, - lualine_x = { 'location' }, - lualine_y = { }, - lualine_z = { } - } - lualine.extensions = { 'fzf' } - lualine.status() end } ```
-### Full config example inside `.vimrc`/`init.vim` +### Vimscript config example
vimrc config ```vim -lua << EOF -local lualine = require('lualine') - lualine.options = { - theme = 'gruvbox', - section_separators = {'', ''}, - component_separators = {'', ''}, - icons_enabled = true, - } - lualine.sections = { - lualine_a = { 'mode' }, - lualine_b = { 'branch' }, - lualine_c = { 'filename' }, - lualine_x = { 'encoding', 'fileformat', 'filetype' }, - lualine_y = { 'progress' }, - lualine_z = { 'location' }, - } - lualine.inactive_sections = { - lualine_a = { }, - lualine_b = { }, - lualine_c = { 'filename' }, - lualine_x = { 'location' }, - lualine_y = { }, - lualine_z = { } - } - lualine.extensions = { 'fzf' } - lualine.status() -EOF +let g:lualine = { + \'options' : { + \ 'theme' : 'gruvbox', + \ 'section_separators' : ['', ''], + \ 'component_separators' : ['', ''], + \ 'icons_enabled' : v:true, + \}, + \'sections' : { + \ 'lualine_a' : [ ['mode', {'upper': v:true,},], ], + \ 'lualine_b' : [ ['branch', {'icon': '',}, ], ], + \ 'lualine_c' : [ ['filename', {'file_status': v:true,},], ], + \ 'lualine_x' : [ 'encoding', 'fileformat', 'filetype' ], + \ 'lualine_y' : [ 'progress' ], + \ 'lualine_z' : [ 'location' ], + \}, + \'inactive_sections' : { + \ 'lualine_a' : [ ], + \ 'lualine_b' : [ ], + \ 'lualine_c' : [ 'filename' ], + \ 'lualine_x' : [ 'location' ], + \ 'lualine_y' : [ ], + \ 'lualine_z' : [ ], + \}, + \'extensions' : [ 'fzf' ], + \} +lua require("lualine").status() ```
diff --git a/THEMES.md b/THEMES.md index 831c5ea..fa38aac 100644 --- a/THEMES.md +++ b/THEMES.md @@ -2,6 +2,9 @@ All available themes are only best effort ports by myself/ other users. If you find a theme to be weird/ wrong please open an issue/ pr. +### auto +if your favourite colorcheme is not yet supported you can use `auto` to make +lualine try to match your colorscheme. ### 16color ![16normal_cropped](https://user-images.githubusercontent.com/41551030/108648240-02d2ae00-74bb-11eb-9ac1-495849621366.png) ![16insert_cropped](https://user-images.githubusercontent.com/41551030/108648219-f77f8280-74ba-11eb-84e4-978bf918c21f.png) diff --git a/doc/lualine.txt b/doc/lualine.txt index 5075dab..c4d85a8 100644 --- a/doc/lualine.txt +++ b/doc/lualine.txt @@ -1,5 +1,5 @@ *lualine.txt* A blazing fast and easy to configure statusline - *lualine_nvim* *lualine* + *lualine_nvim* *lualine* Author: hoob3rt (https://github.com/hoob3rt) License: MIT License @@ -37,15 +37,16 @@ CONTENTS *lualine_contents* 1.3.4. Changing components.................|lualine_changing_components| 1.3.5. Building Custom components............|lualine_custom_components| 1.3.6. Custom options...........................|lualine_custom_options| - 1.3.7. Loading plugin extensions.....|lualine_loading_plugin_extensions| - 1.3.8 Config examples.........................|lualine_config_examples| - 1.3.8.1. Packer.nvim......|lualine_config_example_using_packer.nvim| - 1.3.8.2 VIML example.......|lualine_full_config_example_inside_viml| + 1.3.7. Using tabline as statusline...............|lualine_using_tabline| + 1.3.8. Loading plugin extensions.....|lualine_loading_plugin_extensions| + 1.3.9 Config examples.........................|lualine_config_examples| + 1.3.9.1. Packer.nvim......|lualine_config_example_using_packer.nvim| + 1.3.9.2 VIML example.......|lualine_full_config_example_inside_viml| 1.4. Contributing.....................................|lualine_contributing| 1.5. Screenshots.......................................|lualine_screenshots| ================================================================================ -PERFORMANCE COMPARISM *lualine_performance_comparism* +PERFORMANCE COMPARISM *lualine_performance_comparism* Unlike other statusline plugins lualine loads only defined components, nothing else. @@ -62,7 +63,7 @@ installed -------------------------------------------------------------------------------- INSTALLATION *lualine_installation* -VIM-PLUG *lualine_vim-plug* +VIM-PLUG *lualine_vim-plug* > Plug 'hoob3rt/lualine.nvim' " If you want to have icons in your statusline choose one of these @@ -70,7 +71,7 @@ VIM-PLUG *lualine_vim-plug* Plug 'ryanoasis/vim-devicons' < -PACKER.NVIM *lualine_packer.nvim* +PACKER.NVIM *lualine_packer.nvim* > use { 'hoob3rt/lualine.nvim', @@ -111,7 +112,7 @@ All available themes are listed in THEMES.md (./THEMES.md) Please create a pr if you managed to port a popular theme before me, here is how to do it (./CONTRIBUTING.md). -CHANGING SEPARATOR IN SECTION *lualine_changing_separator* +CHANGING SEPARATOR IN SECTION *lualine_changing_separator* Lualine defines two kinds of seperators. One is for sections and other is for components. Default section seperators are '', '' and component @@ -157,10 +158,10 @@ Lualine defaults~ Available components~ general~ - * branch (git branch) - * diagnostics (diagnostics count from your prefered source) - * encoding (file encoding) - * fileformat (file format) + * branch (git branch) + * diagnostics (diagnostics count from your prefered source) + * encoding (file encoding) + * fileformat (file format) * filename * filetype * location (location in file in line:column format) @@ -170,7 +171,7 @@ Available components~ -------------------------------------------------------------------------------- -BUILDING YOUR COMPONENTS *lualine_custom_components* +BUILDING YOUR COMPONENTS *lualine_custom_components* Using custom functions as lualine component~ @@ -301,13 +302,13 @@ List of options are given below. changes diagnostic's symbol characters. You can set one or more symbols for each level. > - { - 'diagnostics', - symbols = { - -- set the error symbol and use defaults for warn and info. - error = '!!', - }, - } + { + 'diagnostics', + symbols = { + -- set the error symbol and use defaults for warn and info. + error = '!!', + }, + } < • filename~ @@ -346,13 +347,13 @@ List of options are given below. Changes diff's symbol characters. You can set some symbols partly. Color in #rrggbb format > - { - 'diff', - -- set the added symbol and use defaults for modified and removed. - symbols = { - added = 'A', - }, - } + { + 'diff', + -- set the added symbol and use defaults for modified and removed. + symbols = { + added = 'A', + }, + } < Example:~ @@ -371,12 +372,39 @@ Example:~ format = function(name) -- Capitalize first charecter of filename to capital. local path, fname = name:match('(.*/)(.*)') - if not path then path = ''; fname = name end + if not path then path = ''; fname = name end return path .. fname:sub(1, 1):upper() .. fname:sub(2, #fname) end } } +------------------------------------------------------------------------------- +USING TABLINE AS STATUSLINE *lualine_using_tabline* + +You can use lualine to display components in tabline . +The sections, configurations and highlights are same as statusline. + +> + lualine.tabline = { + lualine_a = { }, + lualine_b = { 'branch' }, + lualine_c = { 'filename' }, + lualine_x = { }, + lualine_y = { }, + lualine_z = { }, + } < +This will show branch and filename component in top of neovim inside tabline . + +You can also completely move your statuline to tabline by configuring lualine.tabline +instead of lualine.sections & lualine.inactive_sections and setting them to empty +> + lualine.tabline = { + ...... + } + lualine.sections = {} + lualine.inactive_sections = {} +< + -------------------------------------------------------------------------------- LOADING PLUGIN EXTENSIONS *lualine_loading_plugin_extensions* @@ -393,7 +421,7 @@ using a plugin which is supported you can load it this way: All available extensions are listed in EXTENSIONS.md (./EXTENSIONS.md) -------------------------------------------------------------------------------- -CONGIG EXAMPLES *lualine_config_examples* +CONGIG EXAMPLES *lualine_config_examples* FULL CONFIG EXAMPLE USING PACKER.NVIM *lualine_config_example_using_packer.nvim* @@ -404,31 +432,31 @@ packer config 'hoob3rt/lualine.nvim', requires = {'kyazdani42/nvim-web-devicons', opt = true}, config = function() - local lualine = require('lualine') - lualine.options = { - theme = 'gruvbox', - section_separators = {'', ''}, - component_separators = {'', ''}, - icons_enabled = true, - } - lualine.sections = { - lualine_a = { 'mode' }, - lualine_b = { 'branch' }, - lualine_c = { 'filename' }, - lualine_x = { 'encoding', 'fileformat', 'filetype' }, - lualine_y = { 'progress' }, - lualine_z = { 'location' }, + require('lualine').status{ + options = { + theme = 'gruvbox', + section_separators = {'', ''}, + component_separators = {'', ''}, + icons_enabled = true, + }, + sections = { + lualine_a = { {'mode', upper = true} }, + lualine_b = { {'branch', icon = ''} }, + lualine_c = { {'filename', file_status = true} }, + lualine_x = { 'encoding', 'fileformat', 'filetype' }, + lualine_y = { 'progress' }, + lualine_z = { 'location' }, + }, + inactive_sections = { + lualine_a = { }, + lualine_b = { }, + lualine_c = { 'filename' }, + lualine_x = { 'location' }, + lualine_y = { }, + lualine_z = { } + }, + extensions = { 'fzf' } } - lualine.inactive_sections = { - lualine_a = { }, - lualine_b = { }, - lualine_c = { 'filename' }, - lualine_x = { 'location' }, - lualine_y = { }, - lualine_z = { } - } - lualine.extensions = { 'fzf' } - lualine.status() end } < @@ -440,33 +468,32 @@ FULL CONFIG EXAMPLE INSIDE VIML *lualine_full_config_example_inside_viml* vimrc config > - lua << EOF - local lualine = require('lualine') - lualine.options = { - theme = 'gruvbox', - section_separators = {'', ''}, - component_separators = {'', ''}, - icons_enabled = true, - } - lualine.sections = { - lualine_a = { 'mode' }, - lualine_b = { 'branch' }, - lualine_c = { 'filename' }, - lualine_x = { 'encoding', 'fileformat', 'filetype' }, - lualine_y = { 'progress' }, - lualine_z = { 'location' }, - } - lualine.inactive_sections = { - lualine_a = { }, - lualine_b = { }, - lualine_c = { 'filename' }, - lualine_x = { 'location' }, - lualine_y = { }, - lualine_z = { } - } - lualine.extensions = { 'fzf' } - lualine.status() - EOF + let g:lualine = { + \'options' : { + \ 'theme' : 'gruvbox', + \ 'section_separators' : ['', ''], + \ 'component_separators' : ['', ''], + \ 'icons_enabled' : v:true, + \}, + \'sections' : { + \ 'lualine_a' : [ ['mode', {'upper': v:true,},], ], + \ 'lualine_b' : [ ['branch', {'icon': '',}, ], ], + \ 'lualine_c' : [ ['filename', {'file_status': v:true,},], ], + \ 'lualine_x' : [ 'encoding', 'fileformat', 'filetype' ], + \ 'lualine_y' : [ 'progress' ], + \ 'lualine_z' : [ 'location' ], + \}, + \'inactive_sections' : { + \ 'lualine_a' : [ ], + \ 'lualine_b' : [ ], + \ 'lualine_c' : [ 'filename' ], + \ 'lualine_x' : [ 'location' ], + \ 'lualine_y' : [ ], + \ 'lualine_z' : [ ], + \}, + \'extensions' : [ 'fzf' ], + \} + lua require("lualine").status() < -------------------------------------------------------------------------------- diff --git a/doc/tags b/doc/tags index cfa3558..b37c93a 100644 --- a/doc/tags +++ b/doc/tags @@ -19,4 +19,5 @@ lualine_screenshots lualine.txt /*lualine_screenshots* lualine_setting_theme lualine.txt /*lualine_setting_theme* lualine_starting_lualine lualine.txt /*lualine_starting_lualine* lualine_usage_and_customization lualine.txt /*lualine_usage_and_customization* +lualine_using_tabline lualine.txt /*lualine_using_tabline* lualine_vim-plug lualine.txt /*lualine_vim-plug* diff --git a/lua/lualine.lua b/lua/lualine.lua index 2e2d1bc..e1fca49 100644 --- a/lua/lualine.lua +++ b/lua/lualine.lua @@ -35,6 +35,8 @@ M.inactive_sections = { lualine_z = { } } +M.tabline = {} + M.extensions = {} local function apply_configuration(config_table) @@ -59,6 +61,7 @@ local function apply_configuration(config_table) parse_sections('options') parse_sections('sections') parse_sections('inactive_sections') + parse_sections('tabline') if config_table.extensions then M.extensions = config_table.extensions end end @@ -167,6 +170,7 @@ end local function load_components() load_sections(M.sections) load_sections(M.inactive_sections) + load_sections(M.tabline) end local function load_extensions() @@ -297,25 +301,49 @@ local function status_dispatch() end end -local function exec_autocommands() +local function tabline() + return statusline(M.tabline, true) +end + +local function setup_theme() + lualine_set_theme() _G.lualine_set_theme = lualine_set_theme - _G.lualine_statusline = status_dispatch vim.api.nvim_exec([[ augroup lualine autocmd! autocmd ColorScheme * call v:lua.lualine_set_theme() - autocmd WinLeave,BufLeave * lua vim.wo.statusline=lualine_statusline() - autocmd WinEnter,BufEnter * setlocal statusline=%!v:lua.lualine_statusline() augroup END ]], false) end -function M.status() +local function set_tabline() + if next(M.tabline) ~= nil then + _G.lualine_tabline = tabline + vim.o.tabline = '%!v:lua.lualine_tabline()' + vim.o.showtabline = 2 + end +end + +local function set_statusline() + if next(M.sections) ~= nil or next(M.inactive_sections) ~= nil then + _G.lualine_statusline = status_dispatch + vim.o.statusline = '%!v:lua.lualine_statusline()' + vim.api.nvim_exec([[ + autocmd lualine WinLeave,BufLeave * lua vim.wo.statusline=lualine_statusline() + autocmd lualine WinEnter,BufEnter * setlocal statusline=%!v:lua.lualine_statusline() + ]], false) + end +end + +function M.status(config) + apply_configuration(vim.g.lualine) + apply_configuration(config) check_single_separator() - lualine_set_theme() - exec_autocommands() + setup_theme() load_components() load_extensions() + set_statusline() + set_tabline() end return M diff --git a/lua/lualine/highlight.lua b/lua/lualine/highlight.lua index b21a1a1..5fa8f91 100644 --- a/lua/lualine/highlight.lua +++ b/lua/lualine/highlight.lua @@ -142,7 +142,7 @@ end -- @param left_section_data :(string) section before separator -- @param right_section_data:(string) section after separator -- @param reverse :(string) Whether it's a left separator or right separator --- '▶️' and '◀️' needs reverse colors so this parameter needs to be set true. +-- '▶️' and '◀️' needs reverse colors so this parameter needs to be set true. -- @return: (string) formated highlight group name function M.get_transitional_highlights(left_section_data, right_section_data, reverse ) local left_highlight_name, right_highlight_name @@ -168,16 +168,16 @@ function M.get_transitional_highlights(left_section_data, right_section_data, re right_highlight_name = 'lualine_c_normal' end end - -- When both left and right highlights are same nothing to transition to + -- When both left and right highlights are same nothing to transition to if left_highlight_name == right_highlight_name then return end - -- construct the name of hightlight group + -- construct the name of hightlight group local highlight_name - if left_highlight_name:find('lualine_') == 1 then - highlight_name = left_highlight_name .. '_to_' .. right_highlight_name - else - highlight_name = 'lualine_' .. left_highlight_name .. '_to_' .. right_highlight_name - end + if left_highlight_name:find('lualine_') == 1 then + highlight_name = left_highlight_name .. '_to_' .. right_highlight_name + else + highlight_name = 'lualine_' .. left_highlight_name .. '_to_' .. right_highlight_name + end if not utils.highlight_exists(highlight_name) then -- Create the highlight_group if needed @@ -188,12 +188,12 @@ function M.get_transitional_highlights(left_section_data, right_section_data, re local bg = utils.extract_highlight_colors(right_highlight_name, 'guibg') if not fg then fg = 'none' end if not bg then bg = 'none' end - -- swap the bg and fg when reverse is true. As in that case highlight will - -- be placed before section - if reverse then fg, bg = bg, fg end + -- swap the bg and fg when reverse is true. As in that case highlight will + -- be placed before section + if reverse then fg, bg = bg, fg end highlight(highlight_name, fg, bg) end - -- Create highlights and setup to survive colorscheme changes + -- Create highlights and setup to survive colorscheme changes set_transitional_highlights() utils.expand_set_theme(set_transitional_highlights) end diff --git a/lua/lualine/themes/auto.lua b/lua/lualine/themes/auto.lua new file mode 100644 index 0000000..6cdff15 --- /dev/null +++ b/lua/lualine/themes/auto.lua @@ -0,0 +1,163 @@ +local utils = require'lualine.utils.utils' + +--------------- +-- Constents -- +--------------- +-- fg and bg must have this much contrast range 0 < contrast_threshold < 0.5 +local contrast_threshold = 0.3 +-- how much brightness is changed in percentage for light and dark themes +local brightness_modifier_parameter = 10 + +-- retrives color value from highlight group name in syntax_list +-- first present highlight is returned +local function getHi( scope, syntaxlist ) + for _ , highlight_name in pairs( syntaxlist ) do + if vim.fn.hlexists(highlight_name) ~= 0 then + local color = utils.extract_highlight_colors(highlight_name) + if color.reverse then + if scope == 'guibg' then scope = 'guifg' else scope = 'guibg' end + end + if color[scope] then return color[scope] end + end + end + return '#000000' +end + +-- truns #rrggbb -> { red, green, blue } +local function rgb_str2num(rgb_color_str) + if rgb_color_str:find('#') == 1 then rgb_color_str = rgb_color_str:sub(2, #rgb_color_str) end + local red = tonumber(rgb_color_str:sub(1,2), 16) + local green = tonumber(rgb_color_str:sub(3,4), 16) + local blue = tonumber(rgb_color_str:sub(5,6), 16) + return { red = red, green = green, blue = blue, } +end + +-- turns { red, green, blue } -> #rrggbb +local function rgb_num2str(rgb_color_num) + local rgb_color_str = string.format('#%02x%02x%02x', rgb_color_num.red, + rgb_color_num.green, rgb_color_num.blue) + return rgb_color_str +end + +-- returns brightness lavel of color in range 0 to 1 +-- arbitary value it's basicaly an weighted average +local function get_color_brightness(rgb_color) + local color = rgb_str2num(rgb_color) + local brightness = (color.red * 2 + color.green * 3 + color.blue) / 6 + return brightness / 256 +end + +-- returns average of colors in range 0 to 1 +-- used to ditermine contrast lavel +local function get_color_avg(rgb_color) + local color = rgb_str2num(rgb_color) + return (color.red + color.green + color.blue) / 3 / 256 +end + +-- clamps the val between left and right +local function clamp(val, left, right) + if val > right then return right end + if val < left then return left end + return val +end + +-- changes braghtness of rgb_color by percentage +local function brightness_modifier(rgb_color, parcentage) + local color = rgb_str2num(rgb_color) + color.red = clamp(color.red + (color.red * parcentage / 100), 0, 255) + color.green = clamp(color.green + (color.green * parcentage / 100), 0, 255) + color.blue = clamp(color.blue + (color.blue * parcentage / 100), 0, 255) + return rgb_num2str(color) +end + +-- changes contrast of rgb_color by amount +local function contrast_modifier(rgb_color, amount) + local color = rgb_str2num(rgb_color) + color.red = clamp(color.red + amount, 0, 255) + color.green = clamp(color.green + amount, 0, 255) + color.blue = clamp(color.blue + amount, 0, 255) + return rgb_num2str(color) +end + +-- Changes brightness of foreground color to achive contrast +-- without changing the color +local function apply_contrast(highlight) + local hightlight_bg_avg = get_color_avg(highlight.bg) + local contrast_threshold_config = clamp(contrast_threshold, 0, 0.5) + local contranst_change_step = 5 + if hightlight_bg_avg > .5 then + contranst_change_step = -contranst_change_step + end + + -- donn't waste too much time here max 25 interation should be more than enough + local iteration_count = 1 + while (math.abs(get_color_avg(highlight.fg) - hightlight_bg_avg) < contrast_threshold_config and iteration_count < 25) do + highlight.fg = contrast_modifier(highlight.fg, contranst_change_step) + iteration_count = iteration_count + 1 + end +end + +-- Get the colors to create theme +local colors = { + normal = getHi( 'guibg', {'PmenuSel', 'PmenuThumb', 'TabLineSel' } ), + insert = getHi( 'guifg', {'String', 'MoreMsg' } ), + replace = getHi( 'guifg', {'Number', 'Type' } ), + visual = getHi( 'guifg', {'Special', 'Boolean', 'Constant' } ), + command = getHi( 'guifg', {'Identifier' } ), + back1 = getHi( 'guibg', {'Normal', 'StatusLineNC' } ), + fore = getHi( 'guifg', {'Normal', 'StatusLine' } ), + back2 = getHi( 'guibg', {'StatusLine' } ), +} + + +-- Change brightness of colors +-- darken incase of light theme lighten incase of dark theme + +if get_color_brightness(utils.extract_highlight_colors('Normal', 'guibg')) > 0.5 then + brightness_modifier_parameter = -brightness_modifier_parameter +end + +for name, color in pairs(colors) do + colors[name] = brightness_modifier(color, brightness_modifier_parameter) +end + +-- basic theme defination +local M = { + normal = { + a = { bg = colors.normal, fg = colors.back1, gui='bold' }, + b = { bg = colors.back1, fg = colors.normal }, + c = { bg = colors.back2, fg = colors.fore }, + }, + insert = { + a = { bg = colors.insert, fg = colors.back1, gui='bold' }, + b = { bg = colors.back1, fg = colors.insert }, + c = { bg = colors.back2, fg = colors.fore }, + }, + replace = { + a = { bg = colors.replace, fg= colors.back1, gui='bold' }, + b = { bg = colors.back1, fg= colors.replace }, + c = { bg = colors.back2, fg= colors.fore }, + }, + visual = { + a = { bg = colors.visual, fg= colors.back1, gui='bold' }, + b = { bg = colors.back1, fg= colors.visual }, + c = { bg = colors.back2, fg= colors.fore }, + }, + command = { + a = { bg = colors.command, fg = colors.back1, gui='bold' }, + b = { bg = colors.back1, fg = colors.command }, + c = { bg = colors.back2, fg = colors.fore }, + }, +} + +M.terminal = M.command +M.inactive = M.normal + +-- Apply prpper contrast so text is readable +for _, section in pairs(M) do + for _, highlight in pairs(section) do + apply_contrast(highlight) + end +end + +return M