Merge branch 'master' into extensions
This commit is contained in:
commit
a4690ca4cf
116
README.md
116
README.md
|
@ -58,6 +58,9 @@ use {
|
||||||
```
|
```
|
||||||
|
|
||||||
## Usage and customization
|
## 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.
|
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.
|
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.
|
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
|
### Starting lualine
|
||||||
```lua
|
```lua
|
||||||
local lualine = require('lualine')
|
local lualine = require('lualine')
|
||||||
|
@ -131,7 +132,6 @@ lualine.inactive_sections = {
|
||||||
<details>
|
<details>
|
||||||
<summary><b>Available components</b></summary>
|
<summary><b>Available components</b></summary>
|
||||||
|
|
||||||
* general
|
|
||||||
* branch (git branch)
|
* branch (git branch)
|
||||||
* diagnostics (diagnostics count from your prefered source)
|
* diagnostics (diagnostics count from your prefered source)
|
||||||
* encoding (file encoding)
|
* encoding (file encoding)
|
||||||
|
@ -165,7 +165,7 @@ lualine.sections.lualine_a = { hello }
|
||||||
|
|
||||||
You can use vim functions as a lualine component
|
You can use vim functions as a lualine component
|
||||||
|
|
||||||
```
|
```lua
|
||||||
lualine.sections.lualine_b = { 'FugitiveHead' }
|
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
|
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
|
can be used. Scopes ending with o are options usualy accessed with `&` in vimscript
|
||||||
|
|
||||||
```
|
```lua
|
||||||
lualine.sections.lualine_b = { 'g:coc_status', 'bo:filetype' }
|
lualine.sections.lualine_b = { 'g:coc_status', 'bo:filetype' }
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -274,6 +274,33 @@ lualine.sections.lualine_b = {
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
### 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
|
### 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)
|
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)
|
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
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary><b>packer config</b></summary>
|
<summary><b>packer config</b></summary>
|
||||||
|
@ -294,69 +321,68 @@ All available extensions are listed in [EXTENSIONS.md](./EXTENSIONS.md)
|
||||||
'hoob3rt/lualine.nvim',
|
'hoob3rt/lualine.nvim',
|
||||||
requires = {'kyazdani42/nvim-web-devicons', opt = true},
|
requires = {'kyazdani42/nvim-web-devicons', opt = true},
|
||||||
config = function()
|
config = function()
|
||||||
local lualine = require('lualine')
|
require('lualine').status{
|
||||||
lualine.options = {
|
options = {
|
||||||
theme = 'gruvbox',
|
theme = 'gruvbox',
|
||||||
section_separators = {'', ''},
|
section_separators = {'', ''},
|
||||||
component_separators = {'', ''},
|
component_separators = {'', ''},
|
||||||
icons_enabled = true,
|
icons_enabled = true,
|
||||||
}
|
},
|
||||||
lualine.sections = {
|
sections = {
|
||||||
lualine_a = { 'mode' },
|
lualine_a = { {'mode', upper = true} },
|
||||||
lualine_b = { 'branch' },
|
lualine_b = { {'branch', icon = ''} },
|
||||||
lualine_c = { 'filename' },
|
lualine_c = { {'filename', file_status = true} },
|
||||||
lualine_x = { 'encoding', 'fileformat', 'filetype' },
|
lualine_x = { 'encoding', 'fileformat', 'filetype' },
|
||||||
lualine_y = { 'progress' },
|
lualine_y = { 'progress' },
|
||||||
lualine_z = { 'location' },
|
lualine_z = { 'location' },
|
||||||
}
|
},
|
||||||
lualine.inactive_sections = {
|
inactive_sections = {
|
||||||
lualine_a = { },
|
lualine_a = { },
|
||||||
lualine_b = { },
|
lualine_b = { },
|
||||||
lualine_c = { 'filename' },
|
lualine_c = { 'filename' },
|
||||||
lualine_x = { 'location' },
|
lualine_x = { 'location' },
|
||||||
lualine_y = { },
|
lualine_y = { },
|
||||||
lualine_z = { }
|
lualine_z = { }
|
||||||
|
},
|
||||||
|
extensions = { 'fzf' }
|
||||||
}
|
}
|
||||||
lualine.extensions = { 'fzf' }
|
|
||||||
lualine.status()
|
|
||||||
end
|
end
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### Full config example inside `.vimrc`/`init.vim`
|
### Vimscript config example
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary><b>vimrc config</b></summary>
|
<summary><b>vimrc config</b></summary>
|
||||||
|
|
||||||
```vim
|
```vim
|
||||||
lua << EOF
|
let g:lualine = {
|
||||||
local lualine = require('lualine')
|
\'options' : {
|
||||||
lualine.options = {
|
\ 'theme' : 'gruvbox',
|
||||||
theme = 'gruvbox',
|
\ 'section_separators' : ['', ''],
|
||||||
section_separators = {'', ''},
|
\ 'component_separators' : ['', ''],
|
||||||
component_separators = {'', ''},
|
\ 'icons_enabled' : v:true,
|
||||||
icons_enabled = true,
|
\},
|
||||||
}
|
\'sections' : {
|
||||||
lualine.sections = {
|
\ 'lualine_a' : [ ['mode', {'upper': v:true,},], ],
|
||||||
lualine_a = { 'mode' },
|
\ 'lualine_b' : [ ['branch', {'icon': '',}, ], ],
|
||||||
lualine_b = { 'branch' },
|
\ 'lualine_c' : [ ['filename', {'file_status': v:true,},], ],
|
||||||
lualine_c = { 'filename' },
|
\ 'lualine_x' : [ 'encoding', 'fileformat', 'filetype' ],
|
||||||
lualine_x = { 'encoding', 'fileformat', 'filetype' },
|
\ 'lualine_y' : [ 'progress' ],
|
||||||
lualine_y = { 'progress' },
|
\ 'lualine_z' : [ 'location' ],
|
||||||
lualine_z = { 'location' },
|
\},
|
||||||
}
|
\'inactive_sections' : {
|
||||||
lualine.inactive_sections = {
|
\ 'lualine_a' : [ ],
|
||||||
lualine_a = { },
|
\ 'lualine_b' : [ ],
|
||||||
lualine_b = { },
|
\ 'lualine_c' : [ 'filename' ],
|
||||||
lualine_c = { 'filename' },
|
\ 'lualine_x' : [ 'location' ],
|
||||||
lualine_x = { 'location' },
|
\ 'lualine_y' : [ ],
|
||||||
lualine_y = { },
|
\ 'lualine_z' : [ ],
|
||||||
lualine_z = { }
|
\},
|
||||||
}
|
\'extensions' : [ 'fzf' ],
|
||||||
lualine.extensions = { 'fzf' }
|
\}
|
||||||
lualine.status()
|
lua require("lualine").status()
|
||||||
EOF
|
|
||||||
```
|
```
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -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.
|
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
|
### 16color
|
||||||
![16normal_cropped](https://user-images.githubusercontent.com/41551030/108648240-02d2ae00-74bb-11eb-9ac1-495849621366.png)
|
![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)
|
![16insert_cropped](https://user-images.githubusercontent.com/41551030/108648219-f77f8280-74ba-11eb-84e4-978bf918c21f.png)
|
||||||
|
|
111
doc/lualine.txt
111
doc/lualine.txt
|
@ -37,10 +37,11 @@ CONTENTS *lualine_contents*
|
||||||
1.3.4. Changing components.................|lualine_changing_components|
|
1.3.4. Changing components.................|lualine_changing_components|
|
||||||
1.3.5. Building Custom components............|lualine_custom_components|
|
1.3.5. Building Custom components............|lualine_custom_components|
|
||||||
1.3.6. Custom options...........................|lualine_custom_options|
|
1.3.6. Custom options...........................|lualine_custom_options|
|
||||||
1.3.7. Loading plugin extensions.....|lualine_loading_plugin_extensions|
|
1.3.7. Using tabline as statusline...............|lualine_using_tabline|
|
||||||
1.3.8 Config examples.........................|lualine_config_examples|
|
1.3.8. Loading plugin extensions.....|lualine_loading_plugin_extensions|
|
||||||
1.3.8.1. Packer.nvim......|lualine_config_example_using_packer.nvim|
|
1.3.9 Config examples.........................|lualine_config_examples|
|
||||||
1.3.8.2 VIML example.......|lualine_full_config_example_inside_viml|
|
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.4. Contributing.....................................|lualine_contributing|
|
||||||
1.5. Screenshots.......................................|lualine_screenshots|
|
1.5. Screenshots.......................................|lualine_screenshots|
|
||||||
|
|
||||||
|
@ -376,7 +377,34 @@ Example:~
|
||||||
end
|
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*
|
LOADING PLUGIN EXTENSIONS *lualine_loading_plugin_extensions*
|
||||||
|
@ -404,31 +432,31 @@ packer config
|
||||||
'hoob3rt/lualine.nvim',
|
'hoob3rt/lualine.nvim',
|
||||||
requires = {'kyazdani42/nvim-web-devicons', opt = true},
|
requires = {'kyazdani42/nvim-web-devicons', opt = true},
|
||||||
config = function()
|
config = function()
|
||||||
local lualine = require('lualine')
|
require('lualine').status{
|
||||||
lualine.options = {
|
options = {
|
||||||
theme = 'gruvbox',
|
theme = 'gruvbox',
|
||||||
section_separators = {'', ''},
|
section_separators = {'', ''},
|
||||||
component_separators = {'', ''},
|
component_separators = {'', ''},
|
||||||
icons_enabled = true,
|
icons_enabled = true,
|
||||||
}
|
},
|
||||||
lualine.sections = {
|
sections = {
|
||||||
lualine_a = { 'mode' },
|
lualine_a = { {'mode', upper = true} },
|
||||||
lualine_b = { 'branch' },
|
lualine_b = { {'branch', icon = ''} },
|
||||||
lualine_c = { 'filename' },
|
lualine_c = { {'filename', file_status = true} },
|
||||||
lualine_x = { 'encoding', 'fileformat', 'filetype' },
|
lualine_x = { 'encoding', 'fileformat', 'filetype' },
|
||||||
lualine_y = { 'progress' },
|
lualine_y = { 'progress' },
|
||||||
lualine_z = { 'location' },
|
lualine_z = { 'location' },
|
||||||
}
|
},
|
||||||
lualine.inactive_sections = {
|
inactive_sections = {
|
||||||
lualine_a = { },
|
lualine_a = { },
|
||||||
lualine_b = { },
|
lualine_b = { },
|
||||||
lualine_c = { 'filename' },
|
lualine_c = { 'filename' },
|
||||||
lualine_x = { 'location' },
|
lualine_x = { 'location' },
|
||||||
lualine_y = { },
|
lualine_y = { },
|
||||||
lualine_z = { }
|
lualine_z = { }
|
||||||
|
},
|
||||||
|
extensions = { 'fzf' }
|
||||||
}
|
}
|
||||||
lualine.extensions = { 'fzf' }
|
|
||||||
lualine.status()
|
|
||||||
end
|
end
|
||||||
}
|
}
|
||||||
<
|
<
|
||||||
|
@ -440,33 +468,32 @@ FULL CONFIG EXAMPLE INSIDE VIML *lualine_full_config_example_inside_viml*
|
||||||
|
|
||||||
vimrc config
|
vimrc config
|
||||||
>
|
>
|
||||||
lua << EOF
|
let g:lualine = {
|
||||||
local lualine = require('lualine')
|
\'options' : {
|
||||||
lualine.options = {
|
\ 'theme' : 'gruvbox',
|
||||||
theme = 'gruvbox',
|
\ 'section_separators' : ['', ''],
|
||||||
section_separators = {'', ''},
|
\ 'component_separators' : ['', ''],
|
||||||
component_separators = {'', ''},
|
\ 'icons_enabled' : v:true,
|
||||||
icons_enabled = true,
|
\},
|
||||||
}
|
\'sections' : {
|
||||||
lualine.sections = {
|
\ 'lualine_a' : [ ['mode', {'upper': v:true,},], ],
|
||||||
lualine_a = { 'mode' },
|
\ 'lualine_b' : [ ['branch', {'icon': '',}, ], ],
|
||||||
lualine_b = { 'branch' },
|
\ 'lualine_c' : [ ['filename', {'file_status': v:true,},], ],
|
||||||
lualine_c = { 'filename' },
|
\ 'lualine_x' : [ 'encoding', 'fileformat', 'filetype' ],
|
||||||
lualine_x = { 'encoding', 'fileformat', 'filetype' },
|
\ 'lualine_y' : [ 'progress' ],
|
||||||
lualine_y = { 'progress' },
|
\ 'lualine_z' : [ 'location' ],
|
||||||
lualine_z = { 'location' },
|
\},
|
||||||
}
|
\'inactive_sections' : {
|
||||||
lualine.inactive_sections = {
|
\ 'lualine_a' : [ ],
|
||||||
lualine_a = { },
|
\ 'lualine_b' : [ ],
|
||||||
lualine_b = { },
|
\ 'lualine_c' : [ 'filename' ],
|
||||||
lualine_c = { 'filename' },
|
\ 'lualine_x' : [ 'location' ],
|
||||||
lualine_x = { 'location' },
|
\ 'lualine_y' : [ ],
|
||||||
lualine_y = { },
|
\ 'lualine_z' : [ ],
|
||||||
lualine_z = { }
|
\},
|
||||||
}
|
\'extensions' : [ 'fzf' ],
|
||||||
lualine.extensions = { 'fzf' }
|
\}
|
||||||
lualine.status()
|
lua require("lualine").status()
|
||||||
EOF
|
|
||||||
<
|
<
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
1
doc/tags
1
doc/tags
|
@ -19,4 +19,5 @@ lualine_screenshots lualine.txt /*lualine_screenshots*
|
||||||
lualine_setting_theme lualine.txt /*lualine_setting_theme*
|
lualine_setting_theme lualine.txt /*lualine_setting_theme*
|
||||||
lualine_starting_lualine lualine.txt /*lualine_starting_lualine*
|
lualine_starting_lualine lualine.txt /*lualine_starting_lualine*
|
||||||
lualine_usage_and_customization lualine.txt /*lualine_usage_and_customization*
|
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*
|
lualine_vim-plug lualine.txt /*lualine_vim-plug*
|
||||||
|
|
|
@ -35,6 +35,8 @@ M.inactive_sections = {
|
||||||
lualine_z = { }
|
lualine_z = { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
M.tabline = {}
|
||||||
|
|
||||||
M.extensions = {}
|
M.extensions = {}
|
||||||
|
|
||||||
local function apply_configuration(config_table)
|
local function apply_configuration(config_table)
|
||||||
|
@ -59,6 +61,7 @@ local function apply_configuration(config_table)
|
||||||
parse_sections('options')
|
parse_sections('options')
|
||||||
parse_sections('sections')
|
parse_sections('sections')
|
||||||
parse_sections('inactive_sections')
|
parse_sections('inactive_sections')
|
||||||
|
parse_sections('tabline')
|
||||||
if config_table.extensions then M.extensions = config_table.extensions end
|
if config_table.extensions then M.extensions = config_table.extensions end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -167,6 +170,7 @@ end
|
||||||
local function load_components()
|
local function load_components()
|
||||||
load_sections(M.sections)
|
load_sections(M.sections)
|
||||||
load_sections(M.inactive_sections)
|
load_sections(M.inactive_sections)
|
||||||
|
load_sections(M.tabline)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function load_extensions()
|
local function load_extensions()
|
||||||
|
@ -297,25 +301,49 @@ local function status_dispatch()
|
||||||
end
|
end
|
||||||
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_set_theme = lualine_set_theme
|
||||||
_G.lualine_statusline = status_dispatch
|
|
||||||
vim.api.nvim_exec([[
|
vim.api.nvim_exec([[
|
||||||
augroup lualine
|
augroup lualine
|
||||||
autocmd!
|
autocmd!
|
||||||
autocmd ColorScheme * call v:lua.lualine_set_theme()
|
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
|
augroup END
|
||||||
]], false)
|
]], false)
|
||||||
end
|
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()
|
check_single_separator()
|
||||||
lualine_set_theme()
|
setup_theme()
|
||||||
exec_autocommands()
|
|
||||||
load_components()
|
load_components()
|
||||||
load_extensions()
|
load_extensions()
|
||||||
|
set_statusline()
|
||||||
|
set_tabline()
|
||||||
end
|
end
|
||||||
|
|
||||||
return M
|
return M
|
||||||
|
|
|
@ -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
|
Loading…
Reference in New Issue