Performence improvments (#205)

* Only load default config when needed

* Only load default cterm colors when needed

* Async load components and theme

* Rename: util_colors -> cterm_colors
This commit is contained in:
Shadman 2021-05-04 23:42:26 +06:00 committed by GitHub
parent 64ab49f55a
commit 141417de61
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 57 additions and 42 deletions

View File

@ -1,11 +1,10 @@
-- Copyright (c) 2020-2021 hoob3rt -- Copyright (c) 2020-2021 hoob3rt
-- MIT license, see LICENSE for more details. -- MIT license, see LICENSE for more details.
local M = {} local M = {}
local utils_colors = require 'lualine.utils.cterm_colors' local cterm_colors
local utils = require 'lualine.utils.utils' local utils = require 'lualine.utils.utils'
local section_highlight_map = {x = 'c', y = 'b', z = 'a'} local section_highlight_map = {x = 'c', y = 'b', z = 'a'}
local active_theme = nil local active_theme = nil
local cterm_colors = false
function M.highlight(name, foreground, background, gui, reload) function M.highlight(name, foreground, background, gui, reload)
local command = {'highlight', name} local command = {'highlight', name}
@ -13,14 +12,14 @@ function M.highlight(name, foreground, background, gui, reload)
table.insert(command, 'guifg=' .. foreground) table.insert(command, 'guifg=' .. foreground)
if cterm_colors then if cterm_colors then
table.insert(command, table.insert(command,
'ctermfg=' .. utils_colors.get_cterm_color(foreground)) 'ctermfg=' .. cterm_colors.get_cterm_color(foreground))
end end
end end
if background and background ~= 'none' then if background and background ~= 'none' then
table.insert(command, 'guibg=' .. background) table.insert(command, 'guibg=' .. background)
if cterm_colors then if cterm_colors then
table.insert(command, table.insert(command,
'ctermbg=' .. utils_colors.get_cterm_color(background)) 'ctermbg=' .. cterm_colors.get_cterm_color(background))
end end
end end
if gui then if gui then
@ -36,7 +35,9 @@ end
function M.create_highlight_groups(theme) function M.create_highlight_groups(theme)
utils.clear_highlights() utils.clear_highlights()
active_theme = theme active_theme = theme
cterm_colors = not vim.o.termguicolors if not vim.o.termguicolors then
cterm_colors = require 'lualine.utils.cterm_colors'
end
for mode, sections in pairs(theme) do for mode, sections in pairs(theme) do
for section, colorscheme in pairs(sections) do for section, colorscheme in pairs(sections) do
local highlight_group_name = {'lualine', section, mode} local highlight_group_name = {'lualine', section, mode}

View File

@ -5,7 +5,6 @@ local highlight = require('lualine.highlight')
local config = {} local config = {}
local function apply_configuration(config_table) local function apply_configuration(config_table)
if not config_table then return end
local function parse_sections(section_group_name) local function parse_sections(section_group_name)
if not config_table[section_group_name] then return end if not config_table[section_group_name] then return end
for section_name, section in pairs(config_table[section_group_name]) do for section_name, section in pairs(config_table[section_group_name]) do
@ -81,18 +80,23 @@ local function component_loader(component)
end end
local function load_sections(sections) local function load_sections(sections)
for section_name, section in pairs(sections) do local async_loader
for index, component in pairs(section) do async_loader = vim.loop.new_async(vim.schedule_wrap(function()
if type(component) == 'string' or type(component) == 'function' then for section_name, section in pairs(sections) do
component = {component} for index, component in pairs(section) do
if type(component) == 'string' or type(component) == 'function' then
component = {component}
end
component.self = {}
component.self.section = section_name
-- apply default args
component = vim.tbl_extend('keep', component, config.options)
section[index] = component_loader(component)
end end
component.self = {}
component.self.section = section_name
-- apply default args
component = vim.tbl_extend('keep', component, config.options)
section[index] = component_loader(component)
end end
end async_loader:close()
end))
async_loader:send()
end end
local function load_components() local function load_components()
@ -234,31 +238,36 @@ end
local function tabline() return statusline(config.tabline, true) end local function tabline() return statusline(config.tabline, true) end
local function setup_theme() local function setup_theme()
local function get_theme_from_config() local async_loader
local theme_name = config.options.theme async_loader = vim.loop.new_async(vim.schedule_wrap(function()
if type(theme_name) == 'string' then local function get_theme_from_config()
local ok, theme = pcall(require, 'lualine.themes.' .. theme_name) local theme_name = config.options.theme
if ok then return theme end if type(theme_name) == 'string' then
elseif type(theme_name) == 'table' then local ok, theme = pcall(require, 'lualine.themes.' .. theme_name)
-- use the provided theme as-is if ok then return theme end
return config.options.theme elseif type(theme_name) == 'table' then
-- use the provided theme as-is
return config.options.theme
end
vim.api.nvim_echo({
{
'theme ' .. tostring(theme_name) .. ' not found, defaulting to gruvbox',
'ErrorMsg'
}
}, true, {})
return require 'lualine.themes.gruvbox'
end end
vim.api.nvim_echo({ local theme = get_theme_from_config()
{ highlight.create_highlight_groups(theme)
'theme ' .. tostring(theme_name) .. ' not found, defaulting to gruvbox', vim.api.nvim_exec([[
'ErrorMsg' augroup lualine
} autocmd!
}, true, {}) autocmd ColorScheme * lua require'lualine.utils.utils'.reload_highlights()
return require 'lualine.themes.gruvbox' augroup END
end ]], false)
local theme = get_theme_from_config() async_loader:close()
highlight.create_highlight_groups(theme) end))
vim.api.nvim_exec([[ async_loader:send()
augroup lualine
autocmd!
autocmd ColorScheme * lua require'lualine.utils.utils'.reload_highlights()
augroup END
]], false)
end end
local function set_tabline() local function set_tabline()
@ -272,8 +281,10 @@ local function set_statusline()
if next(config.sections) ~= nil or next(config.inactive_sections) ~= nil then if next(config.sections) ~= nil or next(config.inactive_sections) ~= nil then
vim.o.statusline = '%!v:lua.require\'lualine\'.statusline()' vim.o.statusline = '%!v:lua.require\'lualine\'.statusline()'
vim.api.nvim_exec([[ vim.api.nvim_exec([[
autocmd lualine WinLeave,BufLeave * lua vim.wo.statusline=require'lualine'.statusline() augroup lualine
autocmd lualine WinEnter,BufEnter * set statusline< autocmd WinLeave,BufLeave * lua vim.wo.statusline=require'lualine'.statusline()
autocmd WinEnter,BufEnter * set statusline<
augroup END
]], false) ]], false)
end end
end end

View File

@ -7,6 +7,9 @@ function M.draw_section(section, highlight_name)
local status = {} local status = {}
for _, component in pairs(section) do for _, component in pairs(section) do
-- load components into status table -- load components into status table
if type(component) ~= 'table' or (type(component) == 'table' and not component.component_no) then
return '' -- unknown element in section. section posibly not yet loaded
end
table.insert(status, component:draw(highlight_name)) table.insert(status, component:draw(highlight_name))
end end