Refactor: simplify options (#24)

* Deprecate upper & lower option.

These does not make much sense and `format` option can provide same results

* Unify padding options

* Add persistent notices

* Make separators use left/right keys to specify left right instead of
sequence

* Rename format -> fmt

* Rename condition -> cond

* Rename disable_text -> icon_only

* Unify color_error,warning,info,hint under diagnostics_color

* Unify color_added,modified,removed hint under diff_color
This commit is contained in:
Shadman 2021-09-14 21:14:23 +06:00 committed by GitHub
parent 62bfe80fb6
commit 2f801ed622
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 428 additions and 192 deletions

View File

@ -99,8 +99,8 @@ require'lualine'.setup {
options = {
icons_enabled = true,
theme = 'auto',
component_separators = {'', ''},
section_separators = {'', ''},
component_separators = { left = '', right = ''},
section_separators = { left = '', right = ''},
disabled_filetypes = {}
},
sections = {
@ -181,11 +181,14 @@ Lualine defines two kinds of separators:
```lua
options = {
section_separators = {'', ''},
component_separators = {'', ''}
section_separators = { left = '', right = ''},
component_separators = { left = '', right = ''}
}
```
Here left means it'll be used for left sections (a, b, c) and right means
it'll be used for right sections (x, y, z).
<details><summary>Disabling separators</summary>
```lua
@ -278,12 +281,16 @@ but you cannot use local options as global.
Global option used locally overwrites the global, for example:
```lua
require'lualine'.setup {
options = {lower = true},
sections = {lualine_a = {{'mode', lower = false}}, lualine_b = {'branch'}}
options = {fmt = string.lower},
sections = {lualine_a = {
{'mode', fmt = function(str) return str:sub(1,1) end}},
lualine_b = {'branch'}}
}
```
`mode` will be displayed with `lower = false` and `branch` will be displayed with `lower = true`
`mode` will be formatted with the passed fa=unction so only first char will be
shown . On the other hand branch will be formatted with global formatter
`string.lower` so it will be showed in lower case.
#### Available options
@ -294,11 +301,9 @@ Global option used locally overwrites the global, for example:
options = {
icons_enabled = true, -- displays icons in alongside component
padding = 1, -- adds padding to the left and right of components
left_padding = 1, -- adds padding to the left of components
right_padding =1, -- adds padding to the right of components
upper = false, -- displays components in uppercase
lower = false, -- displays components in lowercase
format = nil -- format function, formats component's output
-- padding can be specified to left or right separately like
-- padding = { left = left_padding, right = right_padding }
fmt = nil -- fmt function, formats component's output
}
```
@ -317,10 +322,12 @@ sections = {
-- when a string is given it's treated as component_separator.
-- When a table is given it's treated as section_separator.
-- This options can be used to set colored separators
-- arround component. Option need to be set like `separator = {'', ''}`.
-- Where first element is left_separator and 2nd element is right separator.
-- arround component. Option need to be set like
-- `separator = { left = '', right = ''}`.
-- Where left will be placed in left side of component
-- and right will be placed in right side of component
-- Passing empty string disables that separator
condition = nil, -- condition function, component is loaded when function returns true
cond = nil, -- condition function, component is loaded when function returns true
-- custom color for component in format
-- color = {fg = '#rrggbb', bg= '#rrggbb', gui='style'}
-- or highlight group
@ -358,10 +365,12 @@ sections = {
-- displays diagnostics from defined severity
sections = {'error', 'warn', 'info', 'hint'},
-- all colors are in format #rrggbb
color_error = nil, -- changes diagnostic's error foreground color
color_warn = nil, -- changes diagnostic's warn foreground color
color_info = nil, -- Changes diagnostic's info foreground color
color_hint = nil, -- Changes diagnostic's hint foreground color
diagnostics_color = {
error = nil, -- changes diagnostic's error foreground color
warn = nil, -- changes diagnostic's warn foreground color
info = nil, -- Changes diagnostic's info foreground color
hint = nil, -- Changes diagnostic's hint foreground color
}
symbols = {error = 'E', warn = 'W', info = 'I', hint = 'H'}
update_in_insert = false, -- Update diagnostics in insert mode
}
@ -393,7 +402,7 @@ sections = {
{
'filetype',
colored = true, -- displays filetype icon in color if set to `true
disable_text = false -- Display only icon for filetype
icon_only = false -- Display only icon for filetype
}
}
}
@ -408,9 +417,11 @@ sections = {
'diff',
colored = true, -- displays diff status in color if set to true
-- all colors are in format #rrggbb
color_added = nil, -- changes diff's added foreground color
color_modified = nil, -- changes diff's modified foreground color
color_removed = nil, -- changes diff's removed foreground color
diff_color = {
added = nil, -- changes diff's added foreground color
modified = nil, -- changes diff's modified foreground color
removed = nil, -- changes diff's removed foreground color
}
symbols = {added = '+', modified = '~', removed = '-'} -- changes diff symbols
source = nil, -- A function that works as a data source for diff.
-- it must return a table like

View File

@ -83,8 +83,8 @@ Default config
options = {
icons_enabled = true,
theme = 'auto',
component_separators = {'', ''},
section_separators = {'', ''},
component_separators = { left = '', right = ''},
section_separators = { left = '', right = ''},
disabled_filetypes = {}
},
sections = {
@ -169,12 +169,15 @@ Lualine defines two kinds of separators:
>
options = {
section_separators = {'', ''},
component_separators = {'', ''}
section_separators = { left = '', right = ''},
component_separators = { left = '', right = ''}
}
<
Here left means itll be used for left sections (a, b, c) and right means
itll be used for right sections (x, y, z).
Disabling separators
>
@ -273,14 +276,17 @@ locally overwrites the global, for example:
>
require'lualine'.setup {
options = {lower = true},
sections = {lualine_a = {{'mode', lower = false}}, lualine_b = {'branch'}}
options = {fmt = string.lower},
sections = {lualine_a = {
{'mode', fmt = function(str) return str:sub(1,1) end}},
lualine_b = {'branch'}}
}
<
`mode` will be displayed with `lower = false` and `branch` will be displayed
with `lower = true`
`mode` will be formatted with the passed fa=unction so only first char will be
shown. On the other hand branch will be formatted with global formatter
`string.lower` so it will be showed in lower case.
*lualine-Available-options*
@ -290,11 +296,9 @@ Global options ~
options = {
icons_enabled = true, -- displays icons in alongside component
padding = 1, -- adds padding to the left and right of components
left_padding = 1, -- adds padding to the left of components
right_padding =1, -- adds padding to the right of components
upper = false, -- displays components in uppercase
lower = false, -- displays components in lowercase
format = nil -- format function, formats component's output
-- padding can be specified to left or right separately like
-- padding = { left = left_padding, right = right_padding }
fmt = nil -- fmt function, formats component's output
}
<
@ -311,10 +315,12 @@ Local options ~
-- when a string is given it's treated as component_separator.
-- When a table is given it's treated as section_separator.
-- This options can be used to set colored separators
-- arround component. Option need to be set like `separator = {'', ''}`.
-- Where first element is left_separator and 2nd element is right separator.
-- arround component. Option need to be set like
-- `separator = { left = '', right = ''}`.
-- Where left will be placed in left side of component
-- and right will be placed in right side of component
-- Passing empty string disables that separator
condition = nil, -- condition function, component is loaded when function returns true
cond = nil, -- condition function, component is loaded when function returns true
-- custom color for component in format
-- color = {fg = '#rrggbb', bg= '#rrggbb', gui='style'}
-- or highlight group
@ -350,10 +356,12 @@ Component specific local options ~
-- displays diagnostics from defined severity
sections = {'error', 'warn', 'info', 'hint'},
-- all colors are in format #rrggbb
color_error = nil, -- changes diagnostic's error foreground color
color_warn = nil, -- changes diagnostic's warn foreground color
color_info = nil, -- Changes diagnostic's info foreground color
color_hint = nil, -- Changes diagnostic's hint foreground color
diagnostics_color = {
error = nil, -- changes diagnostic's error foreground color
warn = nil, -- changes diagnostic's warn foreground color
info = nil, -- Changes diagnostic's info foreground color
hint = nil, -- Changes diagnostic's hint foreground color
}
symbols = {error = 'E', warn = 'W', info = 'I', hint = 'H'}
update_in_insert = false, -- Update diagnostics in insert mode
}
@ -387,7 +395,7 @@ Component specific local options ~
{
'filetype',
colored = true, -- displays filetype icon in color if set to `true
disable_text = false -- Display only icon for filetype
icon_only = false -- Display only icon for filetype
}
}
}
@ -403,9 +411,11 @@ Component specific local options ~
'diff',
colored = true, -- displays diff status in color if set to true
-- all colors are in format #rrggbb
color_added = nil, -- changes diff's added foreground color
color_modified = nil, -- changes diff's modified foreground color
color_removed = nil, -- changes diff's removed foreground color
diff_color = {
added = nil, -- changes diff's added foreground color
modified = nil, -- changes diff's modified foreground color
removed = nil, -- changes diff's removed foreground color
}
symbols = {added = '+', modified = '~', removed = '-'} -- changes diff symbols
source = nil, -- A function that works as a data source for diff.
-- it must return a table like

View File

@ -35,18 +35,18 @@ require('lualine').setup {
options = {
theme = bubbles_theme,
component_separators = '|',
section_separators = { '', '' },
section_separators = { left = '', right = '' },
},
sections = {
lualine_a = {
{ 'mode', separator = { '', '' }, right_padding = 2 },
{ 'mode', separator = { left = '' }, right_padding = 2 },
},
lualine_b = { 'filename', 'branch' },
lualine_c = { 'fileformat' },
lualine_x = {},
lualine_y = { 'filetype', 'progress' },
lualine_z = {
{ 'location', separator = { '', '' }, left_padding = 2 },
{ 'location', separator = { right = '' }, left_padding = 2 },
},
},
inactive_sections = {

View File

@ -83,7 +83,7 @@ ins_left {
return ''
end,
color = { fg = colors.blue }, -- Sets highlighting of component
left_padding = 0, -- We don't need space before this
padding = { left = 0, right = 1 }, -- We don't need space before this
}
ins_left {
@ -116,18 +116,18 @@ ins_left {
return ''
end,
color = 'LualineMode',
left_padding = 0,
padding = { right = 1 },
}
ins_left {
-- filesize component
'filesize',
condition = conditions.buffer_not_empty,
cond = conditions.buffer_not_empty,
}
ins_left {
'filename',
condition = conditions.buffer_not_empty,
cond = conditions.buffer_not_empty,
color = { fg = colors.magenta, gui = 'bold' },
}
@ -139,9 +139,11 @@ ins_left {
'diagnostics',
sources = { 'nvim_lsp' },
symbols = { error = '', warn = '', info = '' },
color_error = { fg = colors.red },
color_warn = { fg = colors.yellow },
color_info = { fg = colors.cyan },
diagnostics_color = {
color_error = { fg = colors.red },
color_warn = { fg = colors.yellow },
color_info = { fg = colors.cyan },
},
}
-- Insert mid section. You can make any number of sections in neovim :)
@ -176,14 +178,14 @@ ins_left {
-- Add components to right sections
ins_right {
'o:encoding', -- option component same as &encoding in viml
upper = true, -- I'm not sure why it's upper case either ;)
condition = conditions.hide_in_width,
fmt = string.upper, -- I'm not sure why it's upper case either ;)
cond = conditions.hide_in_width,
color = { fg = colors.green, gui = 'bold' },
}
ins_right {
'fileformat',
upper = true,
fmt = string.upper,
icons_enabled = false, -- I think icons are cool but Eviline doesn't have them. sigh
color = { fg = colors.green, gui = 'bold' },
}
@ -191,7 +193,7 @@ ins_right {
ins_right {
'branch',
icon = '',
condition = conditions.check_git_workspace,
cond = conditions.check_git_workspace,
color = { fg = colors.violet, gui = 'bold' },
}
@ -199,10 +201,12 @@ ins_right {
'diff',
-- Is it me or the symbol for modified us really weird
symbols = { added = '', modified = '', removed = '' },
color_added = { fg = colors.green },
color_modified = { fg = colors.orange },
color_removed = { fg = colors.red },
condition = conditions.hide_in_width,
diff_color = {
added = { fg = colors.green },
modified = { fg = colors.orange },
removed = { fg = colors.red },
},
cond = conditions.hide_in_width,
}
ins_right {
@ -210,7 +214,7 @@ ins_right {
return ''
end,
color = { fg = colors.blue },
right_padding = 0,
padding = { left = 1 },
}
-- Now don't forget to initialize lualine

View File

@ -5,6 +5,28 @@ local highlight = require 'lualine.highlight'
-- Used to provide a unique id for each component
local component_no = 1
local function check_deprecated_options(options)
local function rename_notice(before, now)
if options[before] then
require('lualine.utils.notices').add_notice(string.format(
[[
### option.%s
%s option has been renamed to `%s`. Please use `%s` instead in your config
for %s component.
]],
before,
before,
now,
now,
options.component_name or 'function'
))
options[now] = options[before]
options[before] = nil
end
end
rename_notice('format', 'fmt')
rename_notice('condition', 'cond')
end
local Component = {
-- Creates a new component
new = function(self, options, child)
@ -15,6 +37,7 @@ local Component = {
-- Operation that are required for creating new components but not for inheritence
if options ~= nil then
component_no = component_no + 1
check_deprecated_options(new_component.options)
if not options.component_name then
new_component.options.component_name = tostring(component_no)
end
@ -29,9 +52,9 @@ local Component = {
if self.options.separator == nil then
if self.options.component_separators then
if self.options.self.section < 'lualine_x' then
self.options.separator = self.options.component_separators[1]
self.options.separator = self.options.component_separators.left
else
self.options.separator = self.options.component_separators[2]
self.options.separator = self.options.component_separators.right
end
end
end
@ -63,8 +86,16 @@ local Component = {
-- Adds spaces to left and right of a component
apply_padding = function(self)
local l_padding = (self.options.left_padding or self.options.padding or 1)
local r_padding = (self.options.right_padding or self.options.padding or 1)
local padding = self.options.padding
local l_padding, r_padding
if padding == nil then
padding = 1
end
if type(padding) == 'number' then
l_padding, r_padding = padding, padding
elseif type(padding) == 'table' then
l_padding, r_padding = padding.left, padding.right
end
if l_padding then
if self.status:find '%%#.*#' == 1 then
-- When component has changed the highlight at begining
@ -114,9 +145,9 @@ local Component = {
if type(separator) == 'table' then
if self.options.separator[2] == '' then
if self.options.self.section < 'lualine_x' then
separator = self.options.component_separators[1]
separator = self.options.component_separators.left
else
separator = self.options.component_separators[2]
separator = self.options.component_separators.right
end
else
return
@ -132,12 +163,12 @@ local Component = {
if type(self.options.separator) ~= 'table' then
return
end
if self.options.separator[1] ~= '' then
self.status = string.format('%%s{%s}%s', self.options.separator[1], self.status)
if self.options.separator.left ~= nil and self.options.separator.left ~= '' then
self.status = string.format('%%s{%s}%s', self.options.separator.left, self.status)
self.strip_previous_separator = true
end
if self.options.separator[2] ~= '' then
self.status = string.format('%s%%S{%s}', self.status, self.options.separator[2])
if self.options.separator.right ~= nil and self.options.separator.right ~= '' then
self.status = string.format('%s%%S{%s}', self.status, self.options.separator.right)
end
end,
@ -162,12 +193,12 @@ local Component = {
self.status = ''
self.applied_separator = ''
if self.options.condition ~= nil and self.options.condition() ~= true then
if self.options.cond ~= nil and self.options.cond() ~= true then
return self.status
end
local status = self:update_status(is_focused)
if self.options.format then
status = self.options.format(status or '')
if self.options.fmt then
status = self.options.fmt(status or '')
end
if type(status) == 'string' and #status > 0 then
self.status = status

View File

@ -9,6 +9,33 @@ local modules = lualine_require.lazy_require {
local Diagnostics = lualine_require.require('lualine.component'):new()
local function check_deprecated_options(options)
if options.color_error or options.color_warn or options.color_info or options.color_hint then
options.diagnostics_color = options.diagnostics_color or {}
require('lualine.utils.notices').add_notice(string.format [[
### diagnostics.options.colors
Previously colors in diagnostics section was set with color_error, color_warning..
separate options . They've been unified under diagnostics_color options.
Now it should be something like:
```lua
{ 'diagnostics',
sources = {'nvim_lsp'},
diagnostics_color = {
error = color_error,
warning = color_warning,
info = color_info,
hint = color_hint,
}
}
```
]])
options.diagnostics_color.error = options.color_error
options.diagnostics_color.warning = options.color_warning
options.diagnostics_color.info = options.color_info
options.diagnostics_color.hint = options.color_hint
end
end
local default_symbols = {
icons = {
error = '', -- xf659
@ -24,25 +51,27 @@ local default_options = {
update_in_insert = false,
sources = nil,
sections = { 'error', 'warn', 'info', 'hint' },
color_error = {
fg = modules.utils.extract_highlight_colors('LspDiagnosticsDefaultError', 'fg')
or modules.utils.extract_highlight_colors('DiffDelete', 'fg')
or '#e32636',
},
color_warn = {
fg = modules.utils.extract_highlight_colors('LspDiagnosticsDefaultWarning', 'fg')
or modules.utils.extract_highlight_colors('DiffText', 'fg')
or '#ffdf00',
},
color_info = {
fg = modules.utils.extract_highlight_colors('LspDiagnosticsDefaultInformation', 'fg')
or modules.utils.extract_highlight_colors('Normal', 'fg')
or '#ffffff',
},
color_hint = {
fg = modules.utils.extract_highlight_colors('LspDiagnosticsDefaultHint', 'fg')
or modules.utils.extract_highlight_colors('DiffChange', 'fg')
or '#d7afaf',
diagnostic_color = {
error = {
fg = modules.utils.extract_highlight_colors('LspDiagnosticsDefaultError', 'fg')
or modules.utils.extract_highlight_colors('DiffDelete', 'fg')
or '#e32636',
},
warn = {
fg = modules.utils.extract_highlight_colors('LspDiagnosticsDefaultWarning', 'fg')
or modules.utils.extract_highlight_colors('DiffText', 'fg')
or '#ffdf00',
},
info = {
fg = modules.utils.extract_highlight_colors('LspDiagnosticsDefaultInformation', 'fg')
or modules.utils.extract_highlight_colors('Normal', 'fg')
or '#ffffff',
},
hint = {
fg = modules.utils.extract_highlight_colors('LspDiagnosticsDefaultHint', 'fg')
or modules.utils.extract_highlight_colors('DiffChange', 'fg')
or '#d7afaf',
},
},
}
-- Initializer
@ -51,6 +80,7 @@ Diagnostics.new = function(self, options, child)
local new_diagnostics = self._parent:new(options, child or Diagnostics)
-- Apply default options
new_diagnostics.options = vim.tbl_deep_extend('keep', new_diagnostics.options or {}, default_options)
check_deprecated_options(new_diagnostics.options)
-- Apply default symbols
new_diagnostics.symbols = vim.tbl_extend(
'keep',
@ -61,22 +91,22 @@ Diagnostics.new = function(self, options, child)
if new_diagnostics.options.colored then
new_diagnostics.highlight_groups = {
error = modules.highlight.create_component_highlight_group(
new_diagnostics.options.color_error,
new_diagnostics.options.diagnostic_color.error,
'diagnostics_error',
new_diagnostics.options
),
warn = modules.highlight.create_component_highlight_group(
new_diagnostics.options.color_warn,
new_diagnostics.options.diagnostic_color.warn,
'diagnostics_warn',
new_diagnostics.options
),
info = modules.highlight.create_component_highlight_group(
new_diagnostics.options.color_info,
new_diagnostics.options.diagnostic_color.info,
'diagnostics_info',
new_diagnostics.options
),
hint = modules.highlight.create_component_highlight_group(
new_diagnostics.options.color_hint,
new_diagnostics.options.diagnostic_color.hint,
'diagnostics_hint',
new_diagnostics.options
),

View File

@ -9,6 +9,30 @@ local modules = lualine_require.lazy_require {
}
local Diff = lualine_require.require('lualine.component'):new()
local function check_deprecated_options(options)
if options.color_added or options.color_modified or options.color_removed then
options.diagnostics_color = options.diagnostics_color or {}
require('lualine.utils.notices').add_notice(string.format [[
### diff.options.colors
Previously colors in diff section was set with color_added, color_modified..
separate options . They've been unified under diff_color option.
Now it should be something like:
```lua
{ 'diff',
diff_color = {
added = color_added,
modified = color_modified,
removed = color_removed,
}
}
```
]])
options.diff_color.added = options.color_added
options.diff_color.modified = options.color_modified
options.diff_color.removed = options.color_removed
end
end
-- Vars
-- variable to store git diff stats
Diff.git_diff = nil
@ -23,14 +47,16 @@ local diff_cache = {} -- Stores last known value of diff of a buffer
local default_options = {
colored = true,
symbols = { added = '+', modified = '~', removed = '-' },
color_added = {
fg = modules.utils.extract_highlight_colors('DiffAdd', 'fg') or '#f0e130',
},
color_modified = {
fg = modules.utils.extract_highlight_colors('DiffChange', 'fg') or '#ff0038',
},
color_removed = {
fg = modules.utils.extract_highlight_colors('DiffDelete', 'fg') or '#ff0038',
diff_color = {
added = {
fg = modules.utils.extract_highlight_colors('DiffAdd', 'fg') or '#f0e130',
},
modified = {
fg = modules.utils.extract_highlight_colors('DiffChange', 'fg') or '#ff0038',
},
removed = {
fg = modules.utils.extract_highlight_colors('DiffDelete', 'fg') or '#ff0038',
},
},
}
@ -38,21 +64,22 @@ local default_options = {
Diff.new = function(self, options, child)
local new_instance = self._parent:new(options, child or Diff)
new_instance.options = vim.tbl_deep_extend('keep', new_instance.options or {}, default_options)
check_deprecated_options(new_instance.options)
-- create highlights and save highlight_name in highlights table
if new_instance.options.colored then
new_instance.highlights = {
added = modules.highlight.create_component_highlight_group(
new_instance.options.color_added,
new_instance.options.diff_color.added,
'diff_added',
new_instance.options
),
modified = modules.highlight.create_component_highlight_group(
new_instance.options.color_modified,
new_instance.options.diff_color.modified,
'diff_modified',
new_instance.options
),
removed = modules.highlight.create_component_highlight_group(
new_instance.options.color_removed,
new_instance.options.diff_color.removed,
'diff_removed',
new_instance.options
),

View File

@ -7,14 +7,36 @@ local modules = lualine_require.lazy_require {
}
local FileType = lualine_require.require('lualine.component'):new()
local function check_deprecated_options(options)
local function rename_notice(before, now)
if options[before] then
require('lualine.utils.notices').add_notice(string.format(
[[
### option.%s
%s option has been renamed to `%s`. Please use `%s` instead in your config
for filetype component.
]],
before,
before,
now,
now
))
options[now] = options[before]
options[before] = nil
end
end
rename_notice('disable_text', 'icon_only')
end
local default_options = {
colored = true,
disable_text = false,
icon_only = false,
}
function FileType:new(options, child)
local new_instance = self._parent:new(options, child or FileType)
new_instance.options = vim.tbl_deep_extend('keep', new_instance.options or {}, default_options)
check_deprecated_options(new_instance.options)
return new_instance
end
@ -59,7 +81,7 @@ function FileType:apply_icon()
return
end
if self.options.disable_text then
if self.options.icon_only then
self.status = icon
else
self.status = icon .. ' ' .. self.status

View File

@ -4,8 +4,8 @@ local config = {
options = {
icons_enabled = true,
theme = 'auto',
component_separators = { '', '' },
section_separators = { '', '' },
component_separators = { left = '', right = '' },
section_separators = { left = '', right = '' },
disabled_filetypes = {},
},
sections = {
@ -28,13 +28,25 @@ local config = {
extensions = {},
}
-- change separator format 'x' or {'x'} to {'x', 'x'}
local function check_sep_format_deprication(sep)
if type(sep) == 'table' and vim.tbl_islist(sep) then
require('lualine.utils.notices').add_persistent_notice(string.format [[
### option.separator
Using list for configuring separators has been depricated. Please configure it
with {left = left_sep, right = right_sep} like table.
]])
sep = { left = sep[1], right = sep[2] or sep[1] }
end
return sep
end
-- change separator format 'x' to {left='x', right='x'}
local function fix_separators(separators)
if separators ~= nil then
if type(separators) == 'string' then
return { separators, separators }
elseif type(separators) == 'table' and #separators == 1 then
return { separators[1], separators[1] }
return { left = separators, right = separators }
else
return check_sep_format_deprication(separators)
end
end
return separators

View File

@ -10,8 +10,7 @@ local empty = {
function()
return ' '
end,
left_padding = 0,
right_padding = 0,
padding = 0,
}
M.sections = {

View File

@ -7,8 +7,7 @@ local empty = {
function()
return ' '
end,
left_padding = 0,
right_padding = 0,
padding = 0,
}
local M = {}

View File

@ -7,8 +7,7 @@ local empty = {
function()
return ' '
end,
left_padding = 0,
right_padding = 0,
padding = 0,
}
local M = {}

View File

@ -19,8 +19,7 @@ local empty = {
function()
return ' '
end,
left_padding = 0,
right_padding = 0,
padding = 0,
}
local M = {}

View File

@ -8,8 +8,7 @@ local empty = {
function()
return ' '
end,
left_padding = 0,
right_padding = 0,
padding = 0,
}
local M = {}

View File

@ -71,6 +71,90 @@ component type '%s' isn't recognised. Check if spelling is correct.]],
end
end
local function option_deprecatation_notice(component)
local types = {
case = function()
local kind = component.upper ~= nil and 'upper' or 'lower'
modules.notice.add_notice(string.format(
[[
### option.%s
Option `%s` has been deprecated.
Please use `fmt` option if you need to change case of a component.
You have some thing like this in your config:
```lua
%s = true,
```
You'll have to change it to this to retain old behavior:
```lua
fmt = string.%s
```
]],
kind,
kind,
kind,
kind
))
end,
padding = function()
local kind = component.left_padding ~= nil and 'left_padding' or 'right_padding'
modules.notice.add_notice(string.format(
[[
### option.%s
Option `%s` has been deprecated.
Please use `padding` option to set left/right padding.
You have some thing like this in your config:
```lua
%s = %d,
```
You'll have to change it to this to retain old behavior:
```lua
padding = { %s = %d }
```
if you've set both left_padding and right_padding for a component
you'll need to have something like
```lua
padding = { left = x, right = y }
```
When you set `padding = x` it's same as `padding = {left = x, right = x}`
]],
kind,
kind,
kind,
component[kind],
kind == 'left_padding' and 'left' or 'right',
component[kind]
))
if component.left_padding and component.right_padding then
component.padding = { left = component.left_padding, right = component.right_padding }
component.left_padding = nil
component.right_padding = nil
elseif component.left_padding then
component.padding = { left = component.left_padding, right = 1 }
component.left_padding = nil
else
component.padding = { left = 1, right = component.right_padding }
component.right_padding = nil
end
end,
}
if component.upper ~= nil or component.lower ~= nil then
types.case()
end
if component.left_padding ~= nil or component.right_padding ~= nil then
types.padding()
end
end
local function load_sections(sections, options)
for section_name, section in pairs(sections) do
for index, component in pairs(section) do
@ -81,6 +165,7 @@ local function load_sections(sections, options)
component.self.section = section_name
-- apply default args
component = vim.tbl_extend('keep', component, options)
option_deprecatation_notice(component)
section[index] = component_loader(component)
end
end

View File

@ -1,6 +1,7 @@
-- To provide notices for user
local M = {}
local notices = {}
local persistent_notices = {}
function M.add_notice(notice)
if type(notice) == 'string' then
@ -9,8 +10,17 @@ function M.add_notice(notice)
table.insert(notices, notice)
end
function M.add_persistent_notice(notice)
if type(notice) == 'string' then
notice = vim.split(notice, '\n')
end
if not vim.tbl_contains(persistent_notices, notice) then
table.insert(persistent_notices, notice)
end
end
function M.notice_message_startup()
if #notices > 0 then
if #notices > 0 or #persistent_notices then
vim.cmd 'command! -nargs=0 LualineNotices lua require"lualine.utils.notices".show_notices()'
vim.schedule(function()
vim.notify(
@ -35,7 +45,8 @@ function M.show_notices()
vim.cmd 'normal q'
return
end
local notice = vim.tbl_flatten(notices)
local notice = vim.tbl_flatten(persistent_notices)
notice = vim.list_extend(notice, vim.tbl_flatten(notices))
vim.fn.append(0, notice)
vim.api.nvim_win_set_cursor(0, { 1, 0 })
end

View File

@ -34,12 +34,12 @@ function M.draw_section(section, section_name, is_focused)
if section_name < 'c' then
if
type(section[first_component_no].options.separator) ~= 'table'
and section[1].options.section_separators[1] ~= ''
and (section[1].options.section_separators.left ~= nil and section[1].options.section_separators.left ~= '')
then
status[component_no] = string.format(
'%s%%S{%s}',
status[component_no],
section[1].options.section_separators[1]
section[1].options.section_separators.left
)
end
end
@ -68,11 +68,11 @@ function M.draw_section(section, section_name, is_focused)
section_name > 'x'
and section[first_component_no]
and type(section[first_component_no].options.separator) ~= 'table'
and section[1].options.section_separators[2] ~= ''
and (section[1].options.section_separators.right ~= nil and section[1].options.section_separators.right ~= '')
then
left_sparator_string = string.format(
'%%s{%s}',
section[first_component_no].options.ls_separator or section[1].options.section_separators[2]
section[first_component_no].options.ls_separator or section[1].options.section_separators.right
)
end

View File

@ -41,10 +41,10 @@ M.build_component_opts = function(opts)
opts.icons_enabled = true
end
if not opts.component_separators then
opts.component_separators = { '', '' }
opts.component_separators = { left = '', right = '' }
end
if not opts.section_separators then
opts.section_separators = { '', '' }
opts.section_separators = { left = '', right = '' }
end
return opts
end

View File

@ -54,7 +54,7 @@ describe('Component:', function()
it('can draw', function()
local opts = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
}
assert_component(nil, opts, 'test')
@ -89,7 +89,7 @@ describe('Component:', function()
describe('Global options:', function()
it('upper', function()
local opts = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
upper = true,
}
@ -101,7 +101,7 @@ describe('Component:', function()
function()
return 'TeSt'
end,
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
lower = true,
}
@ -110,25 +110,23 @@ describe('Component:', function()
it('left_padding', function()
local opts = build_component_opts {
component_separators = { '', '' },
padding = 0,
left_padding = 5,
component_separators = { left = '', right = '' },
padding = { left = 5 },
}
assert_component(nil, opts, ' test')
end)
it('right_padding', function()
local opts = build_component_opts {
component_separators = { '', '' },
padding = 0,
right_padding = 5,
component_separators = { left = '', right = '' },
padding = { right = 5 },
}
assert_component(nil, opts, 'test ')
end)
it('padding', function()
local opts = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 5,
}
assert_component(nil, opts, ' test ')
@ -136,7 +134,7 @@ describe('Component:', function()
it('icon', function()
local opts = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
icon = '0',
}
@ -145,14 +143,14 @@ describe('Component:', function()
it('icons_enabled', function()
local opts = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
icons_enabled = true,
icon = '0',
}
assert_component(nil, opts, '0 test')
local opts2 = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
icons_enabled = false,
icon = '0',
@ -162,37 +160,37 @@ describe('Component:', function()
it('separator', function()
local opts = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
separator = '|',
}
assert_component(nil, opts, 'test|')
end)
it('format', function()
it('fmt', function()
local opts = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
format = function(data)
fmt = function(data)
return data:sub(1, 1):upper() .. data:sub(2, #data)
end,
}
assert_component(nil, opts, 'Test')
end)
it('condition', function()
it('cond', function()
local opts = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
condition = function()
cond = function()
return true
end,
}
assert_component(nil, opts, 'test')
local opts2 = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
condition = function()
cond = function()
return false
end,
}
@ -201,7 +199,7 @@ describe('Component:', function()
it('color', function()
local opts = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
color = 'MyHl',
}
@ -209,7 +207,7 @@ describe('Component:', function()
local custom_link_hl_name = 'lualine_' .. comp.options.component_name .. '_no_mode'
eq('%#' .. custom_link_hl_name .. '#test', comp:draw(opts.hl))
local opts2 = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
color = { bg = '#230055', fg = '#223344' },
}
@ -227,7 +225,7 @@ end)
describe('Encoding component', function()
it('works', function()
local opts = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
}
assert_component('encoding', opts, '%{strlen(&fenc)?&fenc:&enc}')
@ -237,7 +235,7 @@ end)
describe('Fileformat component', function()
it('works with icons', function()
local opts = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
}
local fmt = vim.bo.fileformat
@ -251,7 +249,7 @@ describe('Fileformat component', function()
end)
it('works without icons', function()
local opts = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
icons_enabled = false,
}
@ -273,7 +271,7 @@ describe('Filetype component', function()
it('does not add icon when library unavailable', function()
local opts = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
}
assert_component('filetype', opts, 'lua')
@ -294,10 +292,10 @@ describe('Filetype component', function()
utils.extract_highlight_colors.returns '#000'
local opts = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
colored = true,
disable_text = false,
icon_only = false,
}
assert_component('filetype', opts, '%#MyCompHl_normal#*%#lualine_c_normal# lua')
assert.stub(utils.extract_highlight_colors).was_called_with('test_highlight_group', 'fg')
@ -320,7 +318,7 @@ describe('Filetype component', function()
hl.create_component_highlight_group.returns 'MyCompHl'
utils.extract_highlight_colors.returns '#000'
local opts = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
colored = false,
}
@ -330,7 +328,7 @@ describe('Filetype component', function()
package.loaded['nvim-web-devicons'] = nil
end)
it('displays only icon when disable_text is true', function()
it('displays only icon when icon_only is true', function()
package.loaded['nvim-web-devicons'] = {
get_icon = function()
return '*', 'test_highlight_group'
@ -338,10 +336,10 @@ describe('Filetype component', function()
}
local opts = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
colored = false,
disable_text = true,
icon_only = true,
}
assert_component('filetype', opts, '*')
package.loaded['nvim-web-devicons'] = nil
@ -353,7 +351,7 @@ describe('Hostname component', function()
stub(vim.loop, 'os_gethostname')
vim.loop.os_gethostname.returns 'localhost'
local opts = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
}
assert_component('hostname', opts, 'localhost')
@ -364,7 +362,7 @@ end)
describe('Location component', function()
it('works', function()
local opts = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
}
assert_component('location', opts, '%3l:%-2c')
@ -374,7 +372,7 @@ end)
describe('Progress component', function()
it('works', function()
local opts = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
}
assert_component('progress', opts, '%3P')
@ -386,7 +384,7 @@ describe('Mode component', function()
stub(vim.api, 'nvim_get_mode')
vim.api.nvim_get_mode.returns { mode = 'n', blocking = false }
local opts = build_component_opts {
component_separators = { '', '' },
component_separators = { left = '', right = '' },
padding = 0,
}
assert_component('mode', opts, 'NORMAL')

View File

@ -34,19 +34,19 @@ describe('config parsing', function()
describe('separators', function()
it('default', function()
local config = config_module.apply_configuration {}
eq(config.options.component_separators, { '', '' })
eq(config.options.section_separators, { '', '' })
eq(config.options.component_separators, { left = '', right = '' })
eq(config.options.section_separators, { left = '', right = '' })
end)
it('double separators', function()
local config = {
options = {
component_separators = { 'a', 'b' },
section_separators = { 'c', 'd' },
component_separators = { left = 'a', right = 'b' },
section_separators = { left = 'c', right = 'd' },
},
}
config = config_module.apply_configuration(config)
eq(config.options.component_separators, { 'a', 'b' })
eq(config.options.section_separators, { 'c', 'd' })
eq(config.options.component_separators, { left = 'a', right = 'b' })
eq(config.options.section_separators, { left = 'c', right = 'd' })
end)
describe('single separator', function()
@ -55,16 +55,16 @@ describe('config parsing', function()
options = { component_separators = 'a', section_separators = 'b' },
}
config = config_module.apply_configuration(config)
eq(config.options.component_separators, { 'a', 'a' })
eq(config.options.section_separators, { 'b', 'b' })
eq(config.options.component_separators, { left = 'a', right = 'a' })
eq(config.options.section_separators, { left = 'b', right = 'b' })
end)
it('table', function()
local config = {
options = { component_separators = { 'a' }, section_separators = { 'b' } },
}
config = config_module.apply_configuration(config)
eq(config.options.component_separators, { 'a', 'a' })
eq(config.options.section_separators, { 'b', 'b' })
eq(config.options.component_separators, { left = 'a', right = 'a' })
eq(config.options.section_separators, { left = 'b', right = 'b' })
end)
end)
it('no seprarators', function()

View File

@ -54,7 +54,7 @@ end)
describe('Section genarator', function()
local sec = require 'lualine.utils.section'
it('can draw', function()
local opts = build_component_opts { section_separators = { '', '' } }
local opts = build_component_opts { section_separators = { left = '', right = '' } }
local section = {
require('lualine.components.special.function_component'):new(opts),
require('lualine.components.special.function_component'):new(opts),
@ -63,15 +63,15 @@ describe('Section genarator', function()
end)
it('can remove separators from component with custom colors', function()
local opts = build_component_opts { section_separators = { '', '' } }
local opts = build_component_opts { section_separators = { left = '', right = '' } }
local opts_colored = build_component_opts { color = 'MyColor' }
local opts_colored2 = build_component_opts {
color = { bg = '#223344' },
section_separators = { '', '' },
section_separators = { left = '', right = '' },
}
local opts_colored3 = build_component_opts {
color = { fg = '#223344' },
section_separators = { '', '' },
section_separators = { left = '', right = '' },
}
require('lualine.highlight').create_highlight_groups(require 'lualine.themes.gruvbox')
local section = {