Merge pull request #160 from shadmansaleh/conditional_component_loading

This commit is contained in:
Hubert Pelczarski 2021-04-12 09:25:24 -07:00 committed by GitHub
commit 8a99a0e9e7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 287 additions and 116 deletions

View File

@ -12,6 +12,11 @@ please use lua-format before creating a pr :smile:
* refer to example below to see how themes are defined
* take 4 screenshots showing a different vim modes (normal, insert, visual, replace)
* add your theme with screenshots attached to [THEMES.md](./THEMES.md) while maintaining alphabetical order
* If the colorscheme you're trying to add already support lightline. You can use
[lightline2lualine theme converter](https://gist.github.com/shadmansaleh/000871c9a608a012721c6acc6d7a19b9) to easily port the theme to lualine.
**Note to colorscheme authors** : If you want to support lualine. You can put your
lualine theme at lua/lualine/themes/{your_colorscheme}.lua in you repo.
<details>
<summary><b>theme example</b></summary>

113
README.md
View File

@ -24,6 +24,13 @@ Here is a preview of how lualine can look like.
Screenshots of all available themes are listed in [THEMES.md](./THEMES.md)
For those who want to break the norms. You can create custom looks in lualine .
**Example** :
- [evil_lualine](https://gist.github.com/shadmansaleh/cd526bc166237a5cbd51429cc1f6291b)
![evil_lualine_image](https://user-images.githubusercontent.com/13149513/113875129-4453ba00-97d8-11eb-8f21-94a9ef565db3.png)
## Performance compared to other plugins
Unlike other statusline plugins lualine loads only defined components, nothing else.
@ -81,6 +88,28 @@ 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).
<details>
<summary>Tweeking themes</summary>
You like a theme but would like to tweek some colors.
You can do that in your config easily.
Example:
```lua
local custom_gruvbox = require'lualine.themes.gruvbox'
-- Chnage the background of lualine_c section for normal mode
custom_gruvbox.normal.c.bg = '#112233' -- rgb colors are supported
require'lualine'.setup{
options = { theme = custom_gruvbox },
...
}
```
You can checkout structure of a lualine theme [here](https://github.com/hoob3rt/lualine.nvim/blob/master/CONTRIBUTING.md#adding-a-theme)
</details>
### Changing separators
Lualine defines two kinds of seperators. One is for sections and other is for components. Default section seperators are '', '' and component separators are '', ''.
They require powerline patched fonts. But you can easily change yours to something else like below
@ -170,7 +199,7 @@ sections = {lualine_a = {'FugitiveHead'}}
<details>
<summary><b>Using variables as lualine component</b></summary>
You can use variables from vim and lua globals as a lualine component
You can use variables from vim 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
@ -180,39 +209,79 @@ sections = {lualine_a = {'g:coc_status', 'bo:filetype'}}
</details>
<details>
<summary><b>Using lua expressions as lualine component</b></summary>
You can use any valid lua expression as a component . This allows global
variables to be used as a component too. Even require statements can be used to access values returned by specific scripts.
One liner functions can be inlined by utilizeing this .
For exmaple this will show day of the week.
And 2nd one will display current value of global variabke data.
```lua
sections = {lualine_c = {"os.data('%a')", 'data'}}
```
</details>
<details>
<summary><b>Options for components</b></summary>
### Available options:
Options can change the way a component behave.
There are two kinds of options some that work on every kind of component.
Even the ones you create like custom function component . And some that only
work on specific component.
Detailed list of available options are given below.
#### Global options
These options are available for all components.
Global options change behaviour of all suported components.
All of these options can also be specifically set to all supported components, full example below.
##### Available global options
Option | Default | Behaviour | Supported components
:------: | :------: | :----------: | :-----:
:------: | :------: | :------: | :--------:
icons_enabled | true | Displays icons on components You should have nerd-fonts supported fonts to see icons properly. | branch, fileformat, filetype, location, diagnostics
padding | 1 | Adds padding to the left and right of components | all
left_padding | 1 | Adds padding to the left of components | all
right_padding | 1 | Adds padding to the right of components | all
upper | false | Changes components to be uppercase | all
lower | false | Changes components to be lowercase | all
format | nil | Takes a function . The funtion gets the result of component as argument and it's return value is displayed. So this function can parse and format the output as user wants. | all
##### Global options example
icon | Differs for each component | Displays an icon in front of the component | All
padding | 1 | Adds padding to the left and right of components | All
left_padding | 1 | Adds padding to the left of components | All
right_padding | 1 | Adds padding to the right of components | All
separator | (component_separators) | which separator to use at end of component | all
upper | false | Changes components to be uppercase | All
lower | false | Changes components to be lowercase | All
format | nil | Takes a function . The funtion gets the result of component as argument and it's return value is displayed. So this function can parse and format the output as user wants. | All
condition | nil | Takes a function. The component is loaded if the function returns true otherwise not. It can be used to load some comoonents on specific cases. | All
color | nil | Sets custom color for the component in this format<br></br>`color = {fg = '#rrggbb', bg= '#rrggbb', gui='style'}`<br></br>The fields of color table are optional and default to theme <br></br>Color option can also be a string containing highlight group name `color = "WarningMsg"`. One neat trick set the color to highlight group name then change that highlight with :hi command to change color of that component at runtime. | All
#### Using global options
Global options can be set in two ways. One is as part of options table in setup.
```lua
options = {icons_enabled = true}
require'lualine'.setup{
options = {
icons_enabled = true,
padding = 2,
}
}
```
When set this way these values work as default for all component.
These defaults can be overwritten by setting option as part of component
configuration like following.
```lua
lualine_a = {
-- Displays only first char of mode name
{'mode', format=function(mode_name) return mode_name:sub(1,1) end},
-- Disables icon for branch component
{'branch', icons_enabled=false},
},
lualine_c = {
-- Displays filename only when window is wider then 80
{'filename', condition=function() return vim.fn.winwidth(0) > 80 end},
}
```
#### Component specific options
As mentioned above, all global options can be applied to specific components.
However there are some options which are component-only (you cannot set them as globals)
Option | Default | Behaviour
:------: | :------: | :----:
icon | Differs for each component | Displays an icon in front of the component
color | nil | Sets custom color for the component in this format<br></br>`color = {fg = '#rrggbb', bg= '#rrggbb', gui='style'}`<br></br>The fields of color table are optional and default to theme
In addition, some components have unique options.
* `diagnostics` component options
@ -245,6 +314,8 @@ color_removed | `DiffDelete` foreground color | changes diff's removed section f
symbols | `{added = '+', modified = '~', removed = '-'}` | changes diff's symbols | table containing on or more symbols |
Component specific options can only be set with component configs.
##### Component options example
```lua
sections = {

View File

@ -111,6 +111,25 @@ 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).
Tweeking themes~
You like a theme but would like to tweek some colors.
You can do that in your config easily.
Example:
>
local custom_gruvbox = require'lualine.themes.gruvbox'
-- Chnage the background of lualine_c section for normal mode
custom_gruvbox.normal.c.bg = '#112233' -- rgb colors are supported
require'lualine'.setup{
options = { theme = custom_gruvbox },
...
}
<
You can checkout structure of a lualine theme [here](https://github.com/hoob3rt/lualine.nvim/blob/master/CONTRIBUTING.md#adding-a-theme)
CHANGING SEPARATOR IN SECTION *lualine_changing_separator*
Lualine defines two kinds of seperators. One is for sections and other is
@ -193,13 +212,27 @@ You can use vim functions as a lualine component
Using variables as lualine component~
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
You can use variables from vim. 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
>
sections = {lualine_a = {'g:coc_status', 'bo:filetype'}}
<
Using lua expressions as lualine component~
You can use any valid lua expression as a component . This
allows global variables to be used as a component too. Even
require statements can be used to access values returned by
specific scripts. One liner functions can be inlined by
utilizeing this .
For exmaple this will show day of the week. And 2nd one
will display current value of global variabke data.
>
sections = {lualine_c = {"os.data('%a')", 'data'}}
<
--------------------------------------------------------------------------------
CUSTOM OPTIONS FOR COMPONENTS *lualine_custom_options*
@ -208,11 +241,17 @@ CUSTOM OPTIONS FOR COMPONENTS *lualine_custom_options*
Options for components~
======================
Global options~
----------------------
Available options:~
Global options change behaviour of all suported components.
All of these options can also be specifically set to all supported components.
Options can change the way a component behave.
There are two kinds of options some that work on every kind of component.
Even the ones you create like custom function component . And some that only
work on specific component.
Detailed list of available options are given below.
Global options~
These options are available for all components.
option (default_value)
------ ---------------
@ -222,6 +261,10 @@ option (default_value)
You should have nerd-fonts supported fonts to see icons properly.
Supported components: branch, fileformat, filetype, location, diagnostics
• icon (depends on component)
displays an icon infront of a component
Supported components: all
• padding (1)
spaces on left and right
Supported components: all
@ -234,6 +277,10 @@ option (default_value)
spaces on right
Supported components: all
• separator (component_separators)
which separator to use at end of component
Supported components: all
• upper (false)
Displayed in upper case
Supported components: all
@ -263,12 +310,53 @@ option (default_value)
• icon (differs for each component)
displays an icon infront of a component
• color (nil)
• condition (nil)
Takes a function. The component is loaded if the function
returns true otherwise not. It can be used to load some
comoonents on specific cases.
• color (Theme colors)
color option can be used to set custom color to a component
Color format:
`lua color = {fg = '#rrggbb', bg= '#rrggbb', gui='style'}`
the members of color table are optional and default to theme
Color option can also be a string containing highlight group name >
color = "WarningMsg"`
< One neat trick set the color to highlight group name then change
that highlight with :hi command to change color of that component
at runtime.
Using global options~
Global options can be set in two ways. One is as part of options table in setup.
>
require'lualine'.setup{
options = {
icons_enabled = true,
padding = 2,
}
}
<
When set this way these values work as default for all component.
These defaults can be overwritten by setting option as part of component
configuration like following.
>
lualine_a = {
-- Displays only first char of mode name
{'mode', format=function(mode_name) return mode_name:sub(1,1) end},
-- Disables icon for branch component
{'branch', icons_enabled=false},
},
lualine_c = {
-- Displays filename only when window is wider then 80
{'filename', condition=function() return vim.fn.winwidth(0) > 80 end},
}
<
Component specific options~
In addition, some components have unique options.
@ -347,6 +435,7 @@ In addition, some components have unique options.
changes diff's symbols
Color in `#rrggbb` format
<
Component specific options can only be set with component configs.
Example:~
>
@ -484,4 +573,4 @@ Vimscript config example
lua require("lualine").setup()
<
-------------------------------------------------------------------------------
vim:tw=80:sw=4:ts=8:noet:ft=help:norl:noet:
vim:tw=80:sw=4:ts=8:noet:ft=help:norl:et:

View File

@ -14,7 +14,7 @@ lualine_loading_plugin_extensions lualine.txt /*lualine_loading_plugin_extension
lualine_lualine.nvim lualine.txt /*lualine_lualine.nvim*
lualine_nvim lualine.txt /*lualine_nvim*
lualine_packer.nvim lualine.txt /*lualine_packer.nvim*
lualine_performance_comparism lualine.txt /*lualine_performance_comparism*
lualine_performance_comparison lualine.txt /*lualine_performance_comparison*
lualine_screenshots lualine.txt /*lualine_screenshots*
lualine_setting_theme lualine.txt /*lualine_setting_theme*
lualine_starting_lualine lualine.txt /*lualine_starting_lualine*

View File

@ -37,11 +37,13 @@ local Component = {
create_option_highlights = function(self)
-- set custom highlights
if self.options.color then
if type(self.options.color) == 'table' then
self.options.color_highlight = highlight.create_component_highlight_group(
self.options.color,
self.options.component_name,
self.options)
elseif type(self.options.color) == 'string' then
self.options.color_highlight_link = self.options.color
end
end,
@ -80,6 +82,8 @@ local Component = {
if self.options.color_highlight then
self.status = highlight.component_format_highlight(
self.options.color_highlight) .. self.status
elseif self.options.color_highlight_link then
self.status = '%#' .. self.options.color_highlight_link ..'#'.. self.status
end
self.status = self.status .. default_highlight
end,
@ -118,6 +122,9 @@ local Component = {
-- Driver code of the class
draw = function(self, default_highlight)
self.status = ''
if self.options.condition ~= nil and self.options.condition() ~= true then
return self.status
end
local status = self:update_status()
if self.options.format then status = self.options.format(status or '') end
if type(status) == 'string' and #status > 0 then

View File

@ -2,22 +2,13 @@ local EvalFuncComponent = require('lualine.component'):new()
EvalFuncComponent.update_status = function(self)
local component = self.options[1]
local ok, status = EvalFuncComponent.evallua(component)
local ok, status = pcall(EvalFuncComponent.eval_lua, component)
if not ok then status = EvalFuncComponent.vim_function(component) end
return status
end
EvalFuncComponent.evallua = function(code)
if loadstring(string.format('return %s ~= nil', code)) and
loadstring(string.format([[return %s ~= nil]], code))() then
-- lua veriable component
return true, loadstring(string.format(
[[
local ok, return_val = pcall(tostring, %s)
if ok then return return_val end
return '']], code))()
end
return false, ''
EvalFuncComponent.eval_lua = function(code)
return tostring(loadstring('return '..code)())
end
EvalFuncComponent.vim_function = function(name)

View File

@ -5,16 +5,21 @@ local utils_colors = require 'lualine.utils.cterm_colors'
local utils = require 'lualine.utils.utils'
local section_highlight_map = {x = 'c', y = 'b', z = 'a'}
local active_theme = nil
local cterm_colors = false
function M.highlight(name, foreground, background, gui, reload)
local command = {'highlight', name}
if foreground and foreground ~= 'none' then
table.insert(command, 'ctermfg=' .. utils_colors.get_cterm_color(foreground))
table.insert(command, 'guifg=' .. foreground)
if cterm_colors then
table.insert(command, 'ctermfg=' .. utils_colors.get_cterm_color(foreground))
end
end
if background and background ~= 'none' then
table.insert(command, 'ctermbg=' .. utils_colors.get_cterm_color(background))
table.insert(command, 'guibg=' .. background)
if cterm_colors then
table.insert(command, 'ctermbg=' .. utils_colors.get_cterm_color(background))
end
end
if gui then
table.insert(command, 'cterm=' .. gui)
@ -29,6 +34,7 @@ end
function M.create_highlight_groups(theme)
utils.clear_highlights()
active_theme = theme
cterm_colors = not vim.o.termguicolors
for mode, sections in pairs(theme) do
for section, colorscheme in pairs(sections) do
local highlight_group_name = {'lualine', section, mode}

View File

@ -251,19 +251,17 @@ end
local function set_tabline()
if next(config.tabline) ~= nil then
_G.lualine_tabline = tabline
vim.o.tabline = '%!v:lua.lualine_tabline()'
vim.o.tabline = "%!v:lua.require'lualine'.tabline()"
vim.o.showtabline = 2
end
end
local function set_statusline()
if next(config.sections) ~= nil or next(config.inactive_sections) ~= nil then
_G.lualine_statusline = status_dispatch
vim.o.statusline = '%!v:lua.lualine_statusline()'
vim.o.statusline = "%!v:lua.require'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()
autocmd lualine WinLeave,BufLeave * lua vim.wo.statusline=require'lualine'.statusline()
autocmd lualine WinEnter,BufEnter * set statusline<
]], false)
end
end
@ -279,4 +277,8 @@ local function setup(user_config)
set_tabline()
end
return {setup = setup}
return {
setup = setup,
statusline = status_dispatch,
tabline = tabline,
}