feat: adding component specific options (#60)
This commit is contained in:
parent
d133236761
commit
20d7f33ef9
108
README.md
108
README.md
|
@ -78,7 +78,7 @@ lualine.status()
|
||||||
```
|
```
|
||||||
### Setting a theme
|
### Setting a theme
|
||||||
```lua
|
```lua
|
||||||
lualine.theme = 'gruvbox'
|
lualine.options.theme = 'gruvbox'
|
||||||
```
|
```
|
||||||
|
|
||||||
All available themes are listed in [THEMES.md](./THEMES.md)
|
All available themes are listed in [THEMES.md](./THEMES.md)
|
||||||
|
@ -90,13 +90,13 @@ Lualine defines a separator between components in given section, the default
|
||||||
separator is `|`. You can change the separator this way:
|
separator is `|`. You can change the separator this way:
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
lualine.separator = '|'
|
lualine.options.separator = '|'
|
||||||
```
|
```
|
||||||
|
|
||||||
or disable it
|
or disable it
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
lualine.separator = ''
|
lualine.options.separator = ''
|
||||||
```
|
```
|
||||||
|
|
||||||
### Changing components in lualine sections
|
### Changing components in lualine sections
|
||||||
|
@ -158,6 +158,7 @@ lualine.sections.lualine_a = { hello }
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary><b>Using vim functions as lualine component</b></summary>
|
<summary><b>Using vim functions as lualine component</b></summary>
|
||||||
|
|
||||||
You can use vim functions as a lualine component
|
You can use vim functions as a lualine component
|
||||||
|
@ -181,6 +182,93 @@ lualine.sections.lualine_b = { 'g:coc_status', 'bo:filetype' }
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary><b>Options for components</b></summary>
|
||||||
|
|
||||||
|
### Available options:
|
||||||
|
|
||||||
|
#### Global Default options
|
||||||
|
|
||||||
|
Default options act as default for all components
|
||||||
|
- icons_enabled (Default: true)
|
||||||
|
Displays icons on components
|
||||||
|
You should have powerline supported fonts to see
|
||||||
|
icons properly.\
|
||||||
|
*Suported by branch, fileformat, filetype, location*\
|
||||||
|
Example:
|
||||||
|
```lua
|
||||||
|
lualine.options.icons_enabled = true
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Genaral options
|
||||||
|
These options are available for all components.\
|
||||||
|
option (default_value)\
|
||||||
|
---------- ----------------------
|
||||||
|
- padding (1)\
|
||||||
|
spaces on left and right
|
||||||
|
- left_padding (1)\
|
||||||
|
spaces on left
|
||||||
|
- right_padding (1)\
|
||||||
|
spaces on right
|
||||||
|
- icon (depends on component)
|
||||||
|
displays an icon infront of component
|
||||||
|
- icons_enabled (true)
|
||||||
|
whether to show icon(if available)
|
||||||
|
- separator ('|')
|
||||||
|
which separator to use at end of component
|
||||||
|
- upper (false)\
|
||||||
|
Displayed in upper case
|
||||||
|
- lower (false)\
|
||||||
|
Displayed in lower case
|
||||||
|
- 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.
|
||||||
|
- 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
|
||||||
|
|
||||||
|
#### Component specific options
|
||||||
|
These options are available for specific components only.\
|
||||||
|
List of options are given below.
|
||||||
|
- filename
|
||||||
|
- file_status (true)\
|
||||||
|
Whether to display filemodified status in filename
|
||||||
|
- shorten (true)\
|
||||||
|
Whether to display full/relative path with filename
|
||||||
|
- full_path (false)\
|
||||||
|
Whether to display full path when shorten is false
|
||||||
|
- fileformat
|
||||||
|
- icons_enabled (true)\
|
||||||
|
Whether to displays icon before component
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```lua
|
||||||
|
lualine.sections.lualine_b = {
|
||||||
|
{
|
||||||
|
'branch',
|
||||||
|
icon = '',
|
||||||
|
upper = true,
|
||||||
|
color = { fg = '#00aa22' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'filename',
|
||||||
|
full_name = true,
|
||||||
|
relative = true,
|
||||||
|
format = function(name)
|
||||||
|
-- Capitalize first charecter of filename to capital.
|
||||||
|
local path, fname = name:match('(.*/)(.*)')
|
||||||
|
rerurn path .. fname[1, 1]:upper() .. fname[2, #fname]
|
||||||
|
end
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
### 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)
|
||||||
|
|
||||||
|
@ -202,8 +290,11 @@ All available extensions are listed in [EXTENSIONS.md](./EXTENSIONS.md)
|
||||||
requires = {'kyazdani42/nvim-web-devicons', opt = true},
|
requires = {'kyazdani42/nvim-web-devicons', opt = true},
|
||||||
config = function()
|
config = function()
|
||||||
local lualine = require('lualine')
|
local lualine = require('lualine')
|
||||||
lualine.theme = 'gruvbox'
|
lualine.options = {
|
||||||
lualine.separator = '|'
|
theme = 'gruvbox',
|
||||||
|
separator = '|',
|
||||||
|
icons_enabled = true,
|
||||||
|
}
|
||||||
lualine.sections = {
|
lualine.sections = {
|
||||||
lualine_a = { 'mode' },
|
lualine_a = { 'mode' },
|
||||||
lualine_b = { 'branch' },
|
lualine_b = { 'branch' },
|
||||||
|
@ -236,8 +327,11 @@ All available extensions are listed in [EXTENSIONS.md](./EXTENSIONS.md)
|
||||||
```vim
|
```vim
|
||||||
lua << EOF
|
lua << EOF
|
||||||
local lualine = require('lualine')
|
local lualine = require('lualine')
|
||||||
lualine.theme = 'gruvbox'
|
lualine.options = {
|
||||||
lualine.separator = '|'
|
theme = 'gruvbox',
|
||||||
|
separator = '|',
|
||||||
|
icons_enabled = true,
|
||||||
|
}
|
||||||
lualine.sections = {
|
lualine.sections = {
|
||||||
lualine_a = { 'mode' },
|
lualine_a = { 'mode' },
|
||||||
lualine_b = { 'branch' },
|
lualine_b = { 'branch' },
|
||||||
|
|
138
doc/lualine.txt
138
doc/lualine.txt
|
@ -32,14 +32,15 @@ CONTENTS *lualline-contents*
|
||||||
1.2.2.packer.nvim..................................|lualine-packer.nvim|
|
1.2.2.packer.nvim..................................|lualine-packer.nvim|
|
||||||
1.3. Usage and customization...............|lualine-usage_and_customization|
|
1.3. Usage and customization...............|lualine-usage_and_customization|
|
||||||
1.3.1. Starting lualine.......................|lualine-starting_lualine|
|
1.3.1. Starting lualine.......................|lualine-starting_lualine|
|
||||||
1.3.2. Setting a theme.........................|lualine-setting_a_theme|
|
1.3.2. Setting theme.............................|lualine-setting_theme|
|
||||||
1.3.3. Changing separator...................|lualine-changing_separator|
|
1.3.3. Changing separator...................|lualine-changing_separator|
|
||||||
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. Loading plugin extensions.....|lualine-loading_plugin_extensions|
|
1.3.6. Custom options...........................|lualine-custom_options|
|
||||||
1.3.7 Config examples.........................|lualine-config_examples|
|
1.3.7. Loading plugin extensions.....|lualine-loading_plugin_extensions|
|
||||||
1.3.7.1. Packer.nvim......|lualine-config_example_using_packer.nvim|
|
1.3.8 Config examples.........................|lualine-config_examples|
|
||||||
1.3.7.2 VIML example.......|lualine-full_config_example_inside_viml|
|
1.3.8.1. Packer.nvim......|lualine-config_example_using_packer.nvim|
|
||||||
|
1.3.8.2 VIML example.......|lualine-full_config_example_inside_viml|
|
||||||
1.4. Contributing.....................................|lualine-contributing|
|
1.4. Contributing.....................................|lualine-contributing|
|
||||||
1.5. Screenshots.......................................|lualine-screenshots|
|
1.5. Screenshots.......................................|lualine-screenshots|
|
||||||
|
|
||||||
|
@ -100,9 +101,9 @@ STARTING LUALINE *lualine-starting_lualine*
|
||||||
lualine.status()
|
lualine.status()
|
||||||
<
|
<
|
||||||
|
|
||||||
SETTING A THEME *lualine-setting_a_theme*
|
SETTING THEME *lualine-setting_theme*
|
||||||
>
|
>
|
||||||
lualine.theme = 'gruvbox'
|
lualine.options.theme = 'gruvbox'
|
||||||
<
|
<
|
||||||
|
|
||||||
All available themes are listed in THEMES.md (./THEMES.md)
|
All available themes are listed in THEMES.md (./THEMES.md)
|
||||||
|
@ -115,12 +116,12 @@ CHANGING SEPARATOR IN SECTION *lualine-changing_separator*
|
||||||
Lualine defines a separator between components in given section, the default
|
Lualine defines a separator between components in given section, the default
|
||||||
separator is `|`. You can change the separator this way:
|
separator is `|`. You can change the separator this way:
|
||||||
>
|
>
|
||||||
lualine.separator = '|'
|
lualine.options.separator = '|'
|
||||||
<
|
<
|
||||||
|
|
||||||
or disable it
|
or disable it
|
||||||
>
|
>
|
||||||
lualine.separator = ''
|
lualine.options.separator = ''
|
||||||
<
|
<
|
||||||
|
|
||||||
CHANGING COMPONENTS IN LUALINE SECTIONS *lualine-changing_components*
|
CHANGING COMPONENTS IN LUALINE SECTIONS *lualine-changing_components*
|
||||||
|
@ -196,6 +197,111 @@ can be used. Scopes ending with o are options usualy accessed with `&` in vimscr
|
||||||
lualine.sections.lualine_x = { 'vim.bo.fileencoding' }
|
lualine.sections.lualine_x = { 'vim.bo.fileencoding' }
|
||||||
<
|
<
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
CUSTOM OPTIONS FOR COMPONENTS *lualine-custom_options*
|
||||||
|
|
||||||
|
|
||||||
|
Options for components~
|
||||||
|
======================
|
||||||
|
|
||||||
|
Global Default options~
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
Default options act as default for all components
|
||||||
|
|
||||||
|
icons_enabled (Default: true)
|
||||||
|
|
||||||
|
Displays icons on components
|
||||||
|
You should have powerline supported fonts to see
|
||||||
|
icons properly.
|
||||||
|
Suported by branch, fileformat, filetype, location
|
||||||
|
|
||||||
|
Example:
|
||||||
|
`lualine.options.icons_enabled = true`
|
||||||
|
|
||||||
|
Genaral options~
|
||||||
|
---------------
|
||||||
|
These options are available for all components.
|
||||||
|
|
||||||
|
option (default_value)
|
||||||
|
------ ---------------
|
||||||
|
|
||||||
|
• padding (1)
|
||||||
|
spaces on left and right
|
||||||
|
|
||||||
|
• left_padding (1)
|
||||||
|
spaces on left
|
||||||
|
|
||||||
|
• icon (depends on component)
|
||||||
|
displays an icon infront of a component
|
||||||
|
|
||||||
|
• icons_enabled (true)
|
||||||
|
whether to show icon(if available)
|
||||||
|
|
||||||
|
• right_padding (1)
|
||||||
|
spaces on right
|
||||||
|
|
||||||
|
• separator ('|')
|
||||||
|
which separator to use at end of component
|
||||||
|
|
||||||
|
• upper (false)
|
||||||
|
Displayed in upper case
|
||||||
|
|
||||||
|
• lower (false)
|
||||||
|
Displayed in lower case
|
||||||
|
|
||||||
|
• 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.
|
||||||
|
|
||||||
|
• 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
|
||||||
|
|
||||||
|
|
||||||
|
Component specific options~
|
||||||
|
--------------------------
|
||||||
|
These options are available for specific components only.
|
||||||
|
List of options are given below.
|
||||||
|
|
||||||
|
• filename~
|
||||||
|
• file_status (true)
|
||||||
|
Whether to display filemodified status in filename
|
||||||
|
|
||||||
|
• shorten (true)
|
||||||
|
Whether to display full/relative path with filename
|
||||||
|
|
||||||
|
• full_path (false)
|
||||||
|
Whether to display full path when shorten is false
|
||||||
|
|
||||||
|
• fileformat~
|
||||||
|
• icons_enabled (true)
|
||||||
|
Whether to displays icon before component
|
||||||
|
|
||||||
|
Example:~
|
||||||
|
>
|
||||||
|
lualine.sections.lualine_b = {
|
||||||
|
{
|
||||||
|
'branch',
|
||||||
|
icon = '',
|
||||||
|
upper = true,
|
||||||
|
color = { fg = '#00aa22' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'filename',
|
||||||
|
full_name = true,
|
||||||
|
relative = true,
|
||||||
|
format = function(name)
|
||||||
|
-- Capitalize first charecter of filename to capital.
|
||||||
|
local path, fname = name:match('(.*/)(.*)')
|
||||||
|
rerurn path .. fname[1, 1]:upper() .. fname[2, #fname]
|
||||||
|
end
|
||||||
|
}
|
||||||
|
}
|
||||||
|
<
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
LOADING PLUGIN EXTENSIONS *lualine-loading_plugin_extensions*
|
LOADING PLUGIN EXTENSIONS *lualine-loading_plugin_extensions*
|
||||||
|
@ -224,8 +330,11 @@ packer config
|
||||||
requires = {'kyazdani42/nvim-web-devicons', opt = true},
|
requires = {'kyazdani42/nvim-web-devicons', opt = true},
|
||||||
config = function()
|
config = function()
|
||||||
local lualine = require('lualine')
|
local lualine = require('lualine')
|
||||||
lualine.theme = 'gruvbox'
|
lualine.options = {
|
||||||
lualine.separator = '|'
|
theme = 'gruvbox',
|
||||||
|
separator = '|',
|
||||||
|
icons_enabled = true,
|
||||||
|
}
|
||||||
lualine.sections = {
|
lualine.sections = {
|
||||||
lualine_a = { 'mode' },
|
lualine_a = { 'mode' },
|
||||||
lualine_b = { 'branch' },
|
lualine_b = { 'branch' },
|
||||||
|
@ -257,8 +366,11 @@ vimrc config
|
||||||
>
|
>
|
||||||
lua << EOF
|
lua << EOF
|
||||||
local lualine = require('lualine')
|
local lualine = require('lualine')
|
||||||
lualine.theme = 'gruvbox'
|
lualine.options = {
|
||||||
lualine.separator = '|'
|
theme = 'gruvbox',
|
||||||
|
separator = '|',
|
||||||
|
icons_enabled = true,
|
||||||
|
}
|
||||||
lualine.sections = {
|
lualine.sections = {
|
||||||
lualine_a = { 'mode' },
|
lualine_a = { 'mode' },
|
||||||
lualine_b = { 'branch' },
|
lualine_b = { 'branch' },
|
||||||
|
|
1
doc/tags
1
doc/tags
|
@ -5,6 +5,7 @@ lualine-config_example_using_packer.nvim lualine.txt /*lualine-config_example_us
|
||||||
lualine-config_examples lualine.txt /*lualine-config_examples*
|
lualine-config_examples lualine.txt /*lualine-config_examples*
|
||||||
lualine-contributing lualine.txt /*lualine-contributing*
|
lualine-contributing lualine.txt /*lualine-contributing*
|
||||||
lualine-custom_components lualine.txt /*lualine-custom_components*
|
lualine-custom_components lualine.txt /*lualine-custom_components*
|
||||||
|
lualine-custom_options lualine.txt /*lualine-custom_options*
|
||||||
lualine-full_config_example_inside_viml lualine.txt /*lualine-full_config_example_inside_viml*
|
lualine-full_config_example_inside_viml lualine.txt /*lualine-full_config_example_inside_viml*
|
||||||
lualine-installation lualine.txt /*lualine-installation*
|
lualine-installation lualine.txt /*lualine-installation*
|
||||||
lualine-loading_plugin_extensions lualine.txt /*lualine-loading_plugin_extensions*
|
lualine-loading_plugin_extensions lualine.txt /*lualine-loading_plugin_extensions*
|
||||||
|
|
|
@ -1,15 +1,19 @@
|
||||||
-- 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 utils = require('lualine.utils')
|
local utils_component = require('lualine.utils.component')
|
||||||
|
local utils = require('lualine.utils.utils')
|
||||||
local highlight = require('lualine.highlight')
|
local highlight = require('lualine.highlight')
|
||||||
|
|
||||||
local M = { }
|
local M = { }
|
||||||
|
|
||||||
M.theme = 'gruvbox'
|
|
||||||
local theme_set = {}
|
local theme_set = {}
|
||||||
|
|
||||||
M.separator = '|'
|
M.options = {
|
||||||
|
icons_enabled = true,
|
||||||
|
theme = 'gruvbox',
|
||||||
|
separator = '|',
|
||||||
|
}
|
||||||
|
|
||||||
M.sections = {
|
M.sections = {
|
||||||
lualine_a = { 'mode' },
|
lualine_a = { 'mode' },
|
||||||
|
@ -68,17 +72,51 @@ local function load_special_components(component)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function component_loader(component)
|
||||||
|
if type(component[1]) == 'function' then return component end
|
||||||
|
if type(component[1]) == 'string' then
|
||||||
|
-- Keep component name for later use as component[1] will be overwritten
|
||||||
|
-- With component function
|
||||||
|
component.component_name = component[1]
|
||||||
|
-- apply default args
|
||||||
|
for opt_name, opt_val in pairs(M.options) do
|
||||||
|
if component[opt_name] == nil then
|
||||||
|
component[opt_name] = opt_val
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- load the component
|
||||||
|
local ok, loaded_component = pcall(require, 'lualine.components.' .. component.component_name)
|
||||||
|
if not ok then
|
||||||
|
loaded_component = load_special_components(component.component_name)
|
||||||
|
end
|
||||||
|
component[1] = loaded_component
|
||||||
|
if type(component[1]) == 'table' then
|
||||||
|
component[1] = component[1].init(component)
|
||||||
|
end
|
||||||
|
-- set custom highlights
|
||||||
|
if component.color then
|
||||||
|
local function update_color()
|
||||||
|
component.color_highlight = highlight.create_component_highlight_group(
|
||||||
|
component.color, component.component_name, component)
|
||||||
|
end
|
||||||
|
update_color()
|
||||||
|
utils.expand_set_theme(update_color)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
local function load_components()
|
local function load_components()
|
||||||
local function load_sections(sections)
|
local function load_sections(sections)
|
||||||
for _, section in pairs(sections) do
|
for section_name, section in pairs(sections) do
|
||||||
for index, component in pairs(section) do
|
for index, component in pairs(section) do
|
||||||
if type(component) == 'string' then
|
if type(component) == 'string' or type(component) == 'function' then
|
||||||
local ok,loaded_component = pcall(require, 'lualine.components.' .. component)
|
component = {component}
|
||||||
if not ok then
|
|
||||||
loaded_component = load_special_components(component)
|
|
||||||
end
|
|
||||||
section[index] = loaded_component
|
|
||||||
end
|
end
|
||||||
|
component.self = {}
|
||||||
|
component.self.section = section_name
|
||||||
|
component_loader(component)
|
||||||
|
section[index] = component
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -101,11 +139,11 @@ local function load_extensions()
|
||||||
end
|
end
|
||||||
|
|
||||||
local function set_lualine_theme()
|
local function set_lualine_theme()
|
||||||
if type(M.theme) == 'string' then
|
if type(M.options.theme) == 'string' then
|
||||||
M.theme = require('lualine.themes.'.. M.theme)
|
M.options.theme = require('lualine.themes.'.. M.options.theme)
|
||||||
end
|
end
|
||||||
highlight.create_highlight_groups(M.theme)
|
highlight.create_highlight_groups(M.options.theme)
|
||||||
theme_set = M.theme
|
theme_set = M.options.theme
|
||||||
end
|
end
|
||||||
|
|
||||||
local function statusline(sections, is_focused)
|
local function statusline(sections, is_focused)
|
||||||
|
@ -114,29 +152,29 @@ local function statusline(sections, is_focused)
|
||||||
end
|
end
|
||||||
local status = {}
|
local status = {}
|
||||||
if sections.lualine_a then
|
if sections.lualine_a then
|
||||||
table.insert(status, highlight.format_highlight(is_focused, 'lualine_a'))
|
local hl = highlight.format_highlight(is_focused, 'lualine_a')
|
||||||
table.insert(status, utils.draw_section(sections.lualine_a, M.separator))
|
table.insert(status, utils_component.draw_section(sections.lualine_a, hl))
|
||||||
end
|
end
|
||||||
if sections.lualine_b then
|
if sections.lualine_b then
|
||||||
table.insert(status, highlight.format_highlight(is_focused, 'lualine_b'))
|
local hl = highlight.format_highlight(is_focused, 'lualine_b')
|
||||||
table.insert(status, utils.draw_section(sections.lualine_b, M.separator))
|
table.insert(status, utils_component.draw_section(sections.lualine_b, hl))
|
||||||
end
|
end
|
||||||
if sections.lualine_c then
|
if sections.lualine_c then
|
||||||
table.insert(status, highlight.format_highlight(is_focused, 'lualine_c'))
|
local hl = highlight.format_highlight(is_focused, 'lualine_c')
|
||||||
table.insert(status, utils.draw_section(sections.lualine_c, M.separator))
|
table.insert(status, utils_component.draw_section(sections.lualine_c, hl))
|
||||||
end
|
end
|
||||||
table.insert(status, "%=")
|
table.insert(status, "%=")
|
||||||
if sections.lualine_x then
|
if sections.lualine_x then
|
||||||
table.insert(status, highlight.format_highlight(is_focused, 'lualine_c'))
|
local hl = highlight.format_highlight(is_focused, 'lualine_c')
|
||||||
table.insert(status, utils.draw_section(sections.lualine_x, M.separator))
|
table.insert(status, utils_component.draw_section(sections.lualine_x, hl))
|
||||||
end
|
end
|
||||||
if sections.lualine_y then
|
if sections.lualine_y then
|
||||||
table.insert(status, highlight.format_highlight(is_focused, 'lualine_b'))
|
local hl = highlight.format_highlight(is_focused, 'lualine_b')
|
||||||
table.insert(status, utils.draw_section(sections.lualine_y, M.separator))
|
table.insert(status, utils_component.draw_section(sections.lualine_y, hl))
|
||||||
end
|
end
|
||||||
if sections.lualine_z then
|
if sections.lualine_z then
|
||||||
table.insert(status, highlight.format_highlight(is_focused, 'lualine_a'))
|
local hl = highlight.format_highlight(is_focused, 'lualine_a')
|
||||||
table.insert(status, utils.draw_section(sections.lualine_z, M.separator))
|
table.insert(status, utils_component.draw_section(sections.lualine_z, hl))
|
||||||
end
|
end
|
||||||
return table.concat(status)
|
return table.concat(status)
|
||||||
end
|
end
|
||||||
|
@ -160,10 +198,10 @@ local function exec_autocommands()
|
||||||
end
|
end
|
||||||
|
|
||||||
function M.status()
|
function M.status()
|
||||||
load_components()
|
|
||||||
load_extensions()
|
|
||||||
set_lualine_theme()
|
set_lualine_theme()
|
||||||
exec_autocommands()
|
exec_autocommands()
|
||||||
|
load_components()
|
||||||
|
load_extensions()
|
||||||
_G.lualine_statusline = status_dispatch
|
_G.lualine_statusline = status_dispatch
|
||||||
vim.o.statusline = '%!v:lua.lualine_statusline()'
|
vim.o.statusline = '%!v:lua.lualine_statusline()'
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
-- Copyright (c) 2020-2021 hoob3rt
|
-- Copyright (c) 2020-2021 shadmansaleh
|
||||||
-- MIT license, see LICENSE for more details.
|
-- MIT license, see LICENSE for more details.
|
||||||
|
|
||||||
local git_branch
|
local git_branch
|
||||||
|
@ -62,31 +62,24 @@ local function watch_head()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- returns the git_branch value to be shown on statusline
|
local function branch(options)
|
||||||
local function branch()
|
if not options.icon then
|
||||||
|
options.icon = '' -- e0a0
|
||||||
|
end
|
||||||
|
|
||||||
|
return function()
|
||||||
if not git_branch or #git_branch == 0 then return '' end
|
if not git_branch or #git_branch == 0 then return '' end
|
||||||
local ok,devicons = pcall(require,'nvim-web-devicons')
|
|
||||||
if ok then
|
|
||||||
local icon = devicons.get_icon('git')
|
|
||||||
if icon ~= nil then
|
|
||||||
return icon .. ' ' .. git_branch
|
|
||||||
end
|
|
||||||
return git_branch
|
return git_branch
|
||||||
end
|
end
|
||||||
ok = vim.fn.exists("*WebDevIconsGetFileTypeSymbol")
|
|
||||||
if ok ~= 0 then
|
|
||||||
local icon = ''
|
|
||||||
return icon .. ' ' .. git_branch
|
|
||||||
end
|
|
||||||
return git_branch
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- run watch head on load so branch is present when component is loaded
|
-- run watch head on load so branch is present when component is loaded
|
||||||
watch_head()
|
watch_head()
|
||||||
|
|
||||||
-- TODO Don't export as a global function
|
|
||||||
_G.lualine_branch_update = watch_head
|
|
||||||
-- update branch state of BufEnter as different Buffer may be on different repos
|
-- update branch state of BufEnter as different Buffer may be on different repos
|
||||||
vim.cmd[[autocmd BufEnter * call v:lua.lualine_branch_update()]]
|
vim.cmd[[autocmd BufEnter * lua require'lualine.components.branch'.lualine_branch_update()]]
|
||||||
|
|
||||||
return branch
|
return {
|
||||||
|
init = function(options) return branch(options) end,
|
||||||
|
lualine_branch_update = watch_head
|
||||||
|
}
|
||||||
|
|
|
@ -1,9 +1,19 @@
|
||||||
-- Copyright (c) 2020-2021 hoob3rt
|
-- Copyright (c) 2020-2021 shadmansaleh
|
||||||
-- MIT license, see LICENSE for more details.
|
-- MIT license, see LICENSE for more details.
|
||||||
|
|
||||||
local function fileformat()
|
local function fileformat(options)
|
||||||
local data = [[%{&ff}]]
|
local icon_linux = "" -- e712
|
||||||
return data
|
local icon_windos = "" -- e70f
|
||||||
|
local icon_mac = "" -- e711
|
||||||
|
return function()
|
||||||
|
if options.icons_enabled and not options.icon then
|
||||||
|
local format = vim.bo.fileformat
|
||||||
|
if format == 'unix' then return icon_linux
|
||||||
|
elseif format == 'dos' then return icon_windos
|
||||||
|
elseif format == 'mac' then return icon_mac end
|
||||||
|
end
|
||||||
|
return vim.bo.fileformat
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return fileformat
|
return { init = function(options) return fileformat(options) end }
|
||||||
|
|
|
@ -1,9 +1,34 @@
|
||||||
-- Copyright (c) 2020-2021 hoob3rt
|
-- Copyright (c) 2020-2021 shadmansaleh
|
||||||
-- MIT license, see LICENSE for more details.
|
-- MIT license, see LICENSE for more details.
|
||||||
|
|
||||||
local function filename()
|
local function filename(options)
|
||||||
local data = [[%t %m]]
|
-- setting defaults
|
||||||
|
local file_status, shorten, full_path = true, true, false
|
||||||
|
if options.file_status ~= nil then file_status = options.file_status end
|
||||||
|
if options.shorten ~= nil then shorten = options.shorten end
|
||||||
|
if options.full_path ~= nil then full_path = options.full_path end
|
||||||
|
|
||||||
|
return function()
|
||||||
|
local data
|
||||||
|
if shorten then
|
||||||
|
data = vim.fn.expand('%:t')
|
||||||
|
elseif full_path then
|
||||||
|
data = vim.fn.expand('%:p')
|
||||||
|
else
|
||||||
|
data = vim.fn.expand('%')
|
||||||
|
end
|
||||||
|
if data == '' then
|
||||||
|
data = '[No Name]'
|
||||||
|
elseif vim.fn.winwidth(0) <= 84 or #data > 40 then
|
||||||
|
data = vim.fn.pathshorten(data)
|
||||||
|
end
|
||||||
|
|
||||||
|
if file_status then
|
||||||
|
if vim.bo.modified then data = data .. "[+]"
|
||||||
|
elseif vim.bo.modifiable == false then data = data .. "[-]" end
|
||||||
|
end
|
||||||
return data
|
return data
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return filename
|
return { init = function(options) return filename(options) end }
|
||||||
|
|
|
@ -1,26 +1,24 @@
|
||||||
-- 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 function filetype()
|
local function filetype(options)
|
||||||
|
return function()
|
||||||
local data = vim.bo.filetype
|
local data = vim.bo.filetype
|
||||||
if #data > 0 then
|
if #data > 0 then
|
||||||
local ok,devicons = pcall(require,'nvim-web-devicons')
|
local ok, devicons = pcall(require,'nvim-web-devicons')
|
||||||
if ok then
|
if ok and not options.icon then
|
||||||
local f_name,f_extension = vim.fn.expand('%:t'),vim.fn.expand('%:e')
|
local f_name,f_extension = vim.fn.expand('%:t'),vim.fn.expand('%:e')
|
||||||
local icon = devicons.get_icon(f_name,f_extension)
|
options.icon = devicons.get_icon(f_name,f_extension)
|
||||||
if icon ~= nil then
|
else
|
||||||
return icon .. ' ' .. data
|
|
||||||
end
|
|
||||||
return data
|
|
||||||
end
|
|
||||||
ok = vim.fn.exists("*WebDevIconsGetFileTypeSymbol")
|
ok = vim.fn.exists("*WebDevIconsGetFileTypeSymbol")
|
||||||
if ok ~= 0 then
|
if ok ~= 0 and not options.icon then
|
||||||
local icon = vim.fn.WebDevIconsGetFileTypeSymbol()
|
options.icon = vim.fn.WebDevIconsGetFileTypeSymbol()
|
||||||
return icon .. ' ' .. data
|
end
|
||||||
end
|
end
|
||||||
return data
|
return data
|
||||||
end
|
end
|
||||||
return ''
|
return ''
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return filetype
|
return { init = function(options) return filetype(options) end }
|
||||||
|
|
|
@ -2,13 +2,13 @@
|
||||||
-- MIT license, see LICENSE for more details.
|
-- MIT license, see LICENSE for more details.
|
||||||
|
|
||||||
local M = { }
|
local M = { }
|
||||||
local utils = require "lualine.utils"
|
local utils_colors = require "lualine.utils.cterm_colors"
|
||||||
|
|
||||||
local function highlight (name, foreground, background, gui)
|
local function highlight (name, foreground, background, gui)
|
||||||
local command = {
|
local command = {
|
||||||
'highlight', name,
|
'highlight', name,
|
||||||
'ctermfg=' .. (foreground[2] or utils.get_cterm_color(foreground)),
|
'ctermfg=' .. (foreground[2] or utils_colors.get_cterm_color(foreground)),
|
||||||
'ctermbg=' .. (background[2] or utils.get_cterm_color(background)),
|
'ctermbg=' .. (background[2] or utils_colors.get_cterm_color(background)),
|
||||||
'cterm=' .. (gui or 'none'),
|
'cterm=' .. (gui or 'none'),
|
||||||
'guifg=' .. (foreground[1] or foreground),
|
'guifg=' .. (foreground[1] or foreground),
|
||||||
'guibg=' .. (background[1] or background),
|
'guibg=' .. (background[1] or background),
|
||||||
|
@ -41,12 +41,8 @@ function M.create_highlight_groups(theme)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function M.format_highlight(is_focused, highlight_group)
|
local function append_mode(highlight_group)
|
||||||
local mode = require('lualine.components.mode')()
|
local mode = require('lualine.components.mode')()
|
||||||
highlight_group = [[%#]] .. highlight_group
|
|
||||||
if not is_focused then
|
|
||||||
highlight_group = highlight_group .. [[_inactive]]
|
|
||||||
else
|
|
||||||
if mode == 'VISUAL' or mode == 'V-BLOCK' or mode == 'V-LINE'
|
if mode == 'VISUAL' or mode == 'V-BLOCK' or mode == 'V-LINE'
|
||||||
or mode == 'SELECT' or mode == 'S-LINE' or mode == 'S-BLOCK'then
|
or mode == 'SELECT' or mode == 'S-LINE' or mode == 'S-BLOCK'then
|
||||||
highlight_group = highlight_group .. '_visual'
|
highlight_group = highlight_group .. '_visual'
|
||||||
|
@ -61,6 +57,59 @@ function M.format_highlight(is_focused, highlight_group)
|
||||||
else
|
else
|
||||||
highlight_group = highlight_group .. '_normal'
|
highlight_group = highlight_group .. '_normal'
|
||||||
end
|
end
|
||||||
|
return highlight_group
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Create highlight group with fg bg and gui from theme
|
||||||
|
-- section and theme are extracted from @options.self table
|
||||||
|
-- @@color has to be { fg = "#rrggbb", bg="#rrggbb" gui = "effect" }
|
||||||
|
-- all the color elements are optional if fg or bg is not given options must be provided
|
||||||
|
-- So fg and bg can default the themes colors
|
||||||
|
-- @@highlight_tag is unique tag for highlight group
|
||||||
|
-- returns the name of highlight group
|
||||||
|
-- @@options is parameter of component.init() function
|
||||||
|
function M.create_component_highlight_group(color , highlight_tag, options)
|
||||||
|
if color.bg and color.fg then
|
||||||
|
-- When bg and fg are both present we donn't need to set highlighs for
|
||||||
|
-- each mode as they will surely look the same
|
||||||
|
local highlight_group_name = table.concat({ 'lualine', highlight_tag, 'no_mode'}, '_')
|
||||||
|
vim.cmd(highlight(highlight_group_name, color.fg, color.bg, color.gui))
|
||||||
|
return highlight_group_name
|
||||||
|
end
|
||||||
|
|
||||||
|
local modes = {'normal', 'insert', 'visual', 'replace', 'command', 'terminal', 'inactive'}
|
||||||
|
for _, mode in ipairs(modes) do
|
||||||
|
local highlight_group_name = { options.self.section, highlight_tag, mode }
|
||||||
|
-- convert lualine_a -> a before setting section
|
||||||
|
local section = options.self.section:match('lualine_(.*)')
|
||||||
|
local bg = (color.bg or options.theme[mode][section]['bg'])
|
||||||
|
local fg = (color.fg or options.theme[mode][section]['fg'])
|
||||||
|
vim.cmd(highlight(table.concat(highlight_group_name, '_'), fg, bg, color.gui))
|
||||||
|
end
|
||||||
|
return options.self.section..'_'..highlight_tag
|
||||||
|
end
|
||||||
|
|
||||||
|
-- retrieve highlight_groups for components
|
||||||
|
-- @@highlight_name received from create_component_highlight_group
|
||||||
|
function M.component_format_highlight(highlight_name)
|
||||||
|
local highlight_group = [[%#]]..highlight_name
|
||||||
|
if highlight_name:find('no_mode') == #highlight_name - #'no_mode' + 1 then
|
||||||
|
return highlight_group..'#'
|
||||||
|
end
|
||||||
|
if vim.g.statusline_winid == vim.fn.win_getid() then
|
||||||
|
highlight_group = append_mode(highlight_group)..'#'
|
||||||
|
else
|
||||||
|
highlight_group = highlight_group..'_inactive'..'#'
|
||||||
|
end
|
||||||
|
return highlight_group
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.format_highlight(is_focused, highlight_group)
|
||||||
|
highlight_group = [[%#]] .. highlight_group
|
||||||
|
if not is_focused then
|
||||||
|
highlight_group = highlight_group .. [[_inactive]]
|
||||||
|
else
|
||||||
|
highlight_group = append_mode(highlight_group)
|
||||||
end
|
end
|
||||||
highlight_group = highlight_group .. [[#]]
|
highlight_group = highlight_group .. [[#]]
|
||||||
return highlight_group
|
return highlight_group
|
||||||
|
|
|
@ -0,0 +1,95 @@
|
||||||
|
-- Copyright (c) 2020-2021 shadmansaleh
|
||||||
|
-- MIT license, see LICENSE for more details.
|
||||||
|
|
||||||
|
local M = { }
|
||||||
|
|
||||||
|
local highlight = require'lualine.highlight'
|
||||||
|
|
||||||
|
-- set upper or lower case
|
||||||
|
local function apply_case(status, options)
|
||||||
|
-- Donn't work on components that emit vim statusline escaped chars
|
||||||
|
if status:find('%%') and not status:find('%%%%') then return status end
|
||||||
|
if options.upper == true then
|
||||||
|
return status:upper()
|
||||||
|
elseif options.lower == true then
|
||||||
|
return status:lower()
|
||||||
|
end
|
||||||
|
return status
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Adds spaces to left and right of a component
|
||||||
|
local function apply_padding(status, options)
|
||||||
|
local l_padding = (options.left_padding or options.padding or 1)
|
||||||
|
local r_padding = (options.right_padding or options.padding or 1)
|
||||||
|
if l_padding then status = string.rep(' ', l_padding)..status end
|
||||||
|
if r_padding then status = status..string.rep(' ', r_padding) end
|
||||||
|
return status
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Applies custom highlights for component
|
||||||
|
local function apply_highlights(status, options)
|
||||||
|
if options.color_highlight then
|
||||||
|
status = highlight.component_format_highlight(options.color_highlight) .. status
|
||||||
|
end
|
||||||
|
return status
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Apply icon in front of component
|
||||||
|
local function apply_icon(status, options)
|
||||||
|
if options.icons_enabled and options.icon then
|
||||||
|
status = options.icon .. ' ' .. status
|
||||||
|
end
|
||||||
|
return status
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Apply separator at end of component only when
|
||||||
|
-- custom highlights haven't affected background
|
||||||
|
local function apply_spearator(status, options)
|
||||||
|
if options.separator and #options.separator > 0 and
|
||||||
|
(not options.color or not options.color.bg) then
|
||||||
|
status = status .. options.separator
|
||||||
|
options.separator_applied = true
|
||||||
|
end
|
||||||
|
return status
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Returns formated string for a section
|
||||||
|
function M.draw_section(section, highlight)
|
||||||
|
local status = {}
|
||||||
|
for _, component in pairs(section) do
|
||||||
|
-- Reset flags
|
||||||
|
component.drawn = false -- Flag to check if a component was drawn or not
|
||||||
|
component.separator_applied = false -- Flag to check if separator was applied
|
||||||
|
local localstatus = component[1]()
|
||||||
|
if #localstatus > 0 then
|
||||||
|
-- Apply modifier functions for options
|
||||||
|
if component.format then localstatus = component.format(localstatus) end
|
||||||
|
localstatus = apply_icon(localstatus, component)
|
||||||
|
localstatus = apply_case(localstatus, component)
|
||||||
|
localstatus = apply_padding(localstatus, component)
|
||||||
|
localstatus = apply_highlights(localstatus, component)
|
||||||
|
localstatus = apply_spearator(localstatus, component)
|
||||||
|
table.insert(status, localstatus)
|
||||||
|
component.drawn = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- Draw nothing when all the components were empty
|
||||||
|
if #status == 0 then return '' end
|
||||||
|
-- convert to single string
|
||||||
|
-- highlight is used as separator so custom highlights don't affect
|
||||||
|
-- later components
|
||||||
|
local status_str = highlight .. table.concat(status, highlight)
|
||||||
|
-- Remove separator from last drawn component if available
|
||||||
|
for last_component = #section, 1, -1 do
|
||||||
|
if section[last_component].drawn then
|
||||||
|
if section[last_component].separator_applied then
|
||||||
|
status_str = status_str:sub(1, #status_str - #section[last_component].separator)
|
||||||
|
end
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return status_str
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
return M
|
|
@ -1,25 +1,8 @@
|
||||||
-- Copyright (c) 2020-2021 hoob3rt
|
-- Copyright (c) 2020-2021 shadmansaleh
|
||||||
-- MIT license, see LICENSE for more details.
|
-- MIT license, see LICENSE for more details.
|
||||||
|
|
||||||
local M = { }
|
local M = {}
|
||||||
|
|
||||||
function M.draw_section(section, separator)
|
|
||||||
local status = {}
|
|
||||||
for _, status_function in pairs(section) do
|
|
||||||
local localstatus = status_function()
|
|
||||||
if #localstatus > 0 then
|
|
||||||
table.insert(status, localstatus)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if #status == 0 then
|
|
||||||
return ''
|
|
||||||
end
|
|
||||||
local sep = ' '
|
|
||||||
if #separator > 0 then
|
|
||||||
sep = ' ' .. separator .. ' '
|
|
||||||
end
|
|
||||||
return ' ' .. table.concat(status, sep) .. ' '
|
|
||||||
end
|
|
||||||
|
|
||||||
-- color conversion
|
-- color conversion
|
||||||
local color_table = {
|
local color_table = {
|
||||||
|
@ -317,5 +300,4 @@ function M.get_cterm_color(hex_color)
|
||||||
return closest_cterm_color
|
return closest_cterm_color
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
return M
|
return M
|
|
@ -0,0 +1,17 @@
|
||||||
|
-- Copyright (c) 2020-2021 shadmansaleh
|
||||||
|
-- MIT license, see LICENSE for more details.
|
||||||
|
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
-- Works as a decorator to expand set_lualine_theme functions
|
||||||
|
-- functionality at runtime .
|
||||||
|
function M.expand_set_theme(func)
|
||||||
|
-- execute a local version of global function to not get in a inf recurtion
|
||||||
|
local set_theme = _G.set_lualine_theme
|
||||||
|
_G.set_lualine_theme = function()
|
||||||
|
set_theme()
|
||||||
|
func()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
Loading…
Reference in New Issue