From 8624f7c14e5fef2912d9bd9480aef20924af80b5 Mon Sep 17 00:00:00 2001 From: Shadman Date: Tue, 2 Mar 2021 18:58:34 +0600 Subject: [PATCH] Feat: add configuration in viml and status function (#114) --- README.md | 112 ++++++++++++++--------------- doc/lualine.txt | 143 +++++++++++++++++++------------------- lua/lualine.lua | 33 ++++++++- lua/lualine/highlight.lua | 24 +++---- 4 files changed, 169 insertions(+), 143 deletions(-) diff --git a/README.md b/README.md index 65d6a7a..961bb1d 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,9 @@ use { ``` ## 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. ``` @@ -69,8 +72,6 @@ Lualine has sections as shown below. 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. -Configuration is currently limited to lua, please use lua block or a separate lua file to configure lualine. - ### Starting lualine ```lua local lualine = require('lualine') @@ -265,7 +266,7 @@ lualine.sections.lualine_b = { format = function(name) -- Capitalize first charecter of filename to capital. local path, fname = name:match('(.*/)(.*)') - if not path then path = ''; fname = name end + if not path then path = ''; fname = name end return path .. fname:sub(1, 1):upper() .. fname:sub(2, #fname) end } @@ -284,7 +285,7 @@ lualine.extensions = { 'fzf' } 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
packer config @@ -294,69 +295,68 @@ All available extensions are listed in [EXTENSIONS.md](./EXTENSIONS.md) 'hoob3rt/lualine.nvim', requires = {'kyazdani42/nvim-web-devicons', opt = true}, config = function() - local lualine = require('lualine') - lualine.options = { - theme = 'gruvbox', - section_separators = {'', ''}, - component_separators = {'', ''}, - icons_enabled = true, + require('lualine').status{ + options = { + theme = 'gruvbox', + section_separators = {'', ''}, + component_separators = {'', ''}, + icons_enabled = true, + }, + sections = { + lualine_a = { {'mode', upper = true} }, + lualine_b = { {'branch', icon = ''} }, + lualine_c = { {'filename', file_status = true} }, + lualine_x = { 'encoding', 'fileformat', 'filetype' }, + lualine_y = { 'progress' }, + lualine_z = { 'location' }, + }, + inactive_sections = { + lualine_a = { }, + lualine_b = { }, + lualine_c = { 'filename' }, + lualine_x = { 'location' }, + lualine_y = { }, + lualine_z = { } + }, + extensions = { 'fzf' } } - lualine.sections = { - lualine_a = { 'mode' }, - lualine_b = { 'branch' }, - lualine_c = { 'filename' }, - lualine_x = { 'encoding', 'fileformat', 'filetype' }, - lualine_y = { 'progress' }, - lualine_z = { 'location' }, - } - lualine.inactive_sections = { - lualine_a = { }, - lualine_b = { }, - lualine_c = { 'filename' }, - lualine_x = { 'location' }, - lualine_y = { }, - lualine_z = { } - } - lualine.extensions = { 'fzf' } - lualine.status() end } ```
-### Full config example inside `.vimrc`/`init.vim` +### Vimscript config example
vimrc config ```vim -lua << EOF -local lualine = require('lualine') - lualine.options = { - theme = 'gruvbox', - section_separators = {'', ''}, - component_separators = {'', ''}, - icons_enabled = true, - } - lualine.sections = { - lualine_a = { 'mode' }, - lualine_b = { 'branch' }, - lualine_c = { 'filename' }, - lualine_x = { 'encoding', 'fileformat', 'filetype' }, - lualine_y = { 'progress' }, - lualine_z = { 'location' }, - } - lualine.inactive_sections = { - lualine_a = { }, - lualine_b = { }, - lualine_c = { 'filename' }, - lualine_x = { 'location' }, - lualine_y = { }, - lualine_z = { } - } - lualine.extensions = { 'fzf' } - lualine.status() -EOF +let g:lualine = { + \'options' : { + \ 'theme' : 'gruvbox', + \ 'section_separators' : ['', ''], + \ 'component_separators' : ['', ''], + \ 'icons_enabled' : v:true, + \}, + \'sections' : { + \ 'lualine_a' : [ ['mode', {'upper': v:true,},], ], + \ 'lualine_b' : [ ['branch', {'icon': '',}, ], ], + \ 'lualine_c' : [ ['filename', {'file_status': v:true,},], ], + \ 'lualine_x' : [ 'encoding', 'fileformat', 'filetype' ], + \ 'lualine_y' : [ 'progress' ], + \ 'lualine_z' : [ 'location' ], + \}, + \'inactive_sections' : { + \ 'lualine_a' : [ ], + \ 'lualine_b' : [ ], + \ 'lualine_c' : [ 'filename' ], + \ 'lualine_x' : [ 'location' ], + \ 'lualine_y' : [ ], + \ 'lualine_z' : [ ], + \}, + \'extensions' : [ 'fzf' ], + \} +lua require("lualine").status() ```
diff --git a/doc/lualine.txt b/doc/lualine.txt index 5075dab..c615d1b 100644 --- a/doc/lualine.txt +++ b/doc/lualine.txt @@ -1,5 +1,5 @@ *lualine.txt* A blazing fast and easy to configure statusline - *lualine_nvim* *lualine* + *lualine_nvim* *lualine* Author: hoob3rt (https://github.com/hoob3rt) License: MIT License @@ -38,14 +38,14 @@ CONTENTS *lualine_contents* 1.3.5. Building Custom components............|lualine_custom_components| 1.3.6. Custom options...........................|lualine_custom_options| 1.3.7. Loading plugin extensions.....|lualine_loading_plugin_extensions| - 1.3.8 Config examples.........................|lualine_config_examples| - 1.3.8.1. Packer.nvim......|lualine_config_example_using_packer.nvim| + 1.3.8 Config examples.........................|lualine_config_examples| + 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.5. Screenshots.......................................|lualine_screenshots| ================================================================================ -PERFORMANCE COMPARISM *lualine_performance_comparism* +PERFORMANCE COMPARISM *lualine_performance_comparism* Unlike other statusline plugins lualine loads only defined components, nothing else. @@ -62,7 +62,7 @@ installed -------------------------------------------------------------------------------- INSTALLATION *lualine_installation* -VIM-PLUG *lualine_vim-plug* +VIM-PLUG *lualine_vim-plug* > Plug 'hoob3rt/lualine.nvim' " If you want to have icons in your statusline choose one of these @@ -70,7 +70,7 @@ VIM-PLUG *lualine_vim-plug* Plug 'ryanoasis/vim-devicons' < -PACKER.NVIM *lualine_packer.nvim* +PACKER.NVIM *lualine_packer.nvim* > use { 'hoob3rt/lualine.nvim', @@ -111,7 +111,7 @@ 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). -CHANGING SEPARATOR IN SECTION *lualine_changing_separator* +CHANGING SEPARATOR IN SECTION *lualine_changing_separator* Lualine defines two kinds of seperators. One is for sections and other is for components. Default section seperators are '', '' and component @@ -157,10 +157,10 @@ Lualine defaults~ Available components~ general~ - * branch (git branch) - * diagnostics (diagnostics count from your prefered source) - * encoding (file encoding) - * fileformat (file format) + * branch (git branch) + * diagnostics (diagnostics count from your prefered source) + * encoding (file encoding) + * fileformat (file format) * filename * filetype * location (location in file in line:column format) @@ -170,7 +170,7 @@ Available components~ -------------------------------------------------------------------------------- -BUILDING YOUR COMPONENTS *lualine_custom_components* +BUILDING YOUR COMPONENTS *lualine_custom_components* Using custom functions as lualine component~ @@ -301,13 +301,13 @@ List of options are given below. changes diagnostic's symbol characters. You can set one or more symbols for each level. > - { - 'diagnostics', - symbols = { - -- set the error symbol and use defaults for warn and info. - error = '!!', - }, - } + { + 'diagnostics', + symbols = { + -- set the error symbol and use defaults for warn and info. + error = '!!', + }, + } < • filename~ @@ -371,7 +371,7 @@ Example:~ format = function(name) -- Capitalize first charecter of filename to capital. local path, fname = name:match('(.*/)(.*)') - if not path then path = ''; fname = name end + if not path then path = ''; fname = name end return path .. fname:sub(1, 1):upper() .. fname:sub(2, #fname) end } @@ -393,7 +393,7 @@ using a plugin which is supported you can load it this way: All available extensions are listed in EXTENSIONS.md (./EXTENSIONS.md) -------------------------------------------------------------------------------- -CONGIG EXAMPLES *lualine_config_examples* +CONGIG EXAMPLES *lualine_config_examples* FULL CONFIG EXAMPLE USING PACKER.NVIM *lualine_config_example_using_packer.nvim* @@ -404,31 +404,31 @@ packer config 'hoob3rt/lualine.nvim', requires = {'kyazdani42/nvim-web-devicons', opt = true}, config = function() - local lualine = require('lualine') - lualine.options = { - theme = 'gruvbox', - section_separators = {'', ''}, - component_separators = {'', ''}, - icons_enabled = true, - } - lualine.sections = { - lualine_a = { 'mode' }, - lualine_b = { 'branch' }, - lualine_c = { 'filename' }, - lualine_x = { 'encoding', 'fileformat', 'filetype' }, - lualine_y = { 'progress' }, - lualine_z = { 'location' }, + require('lualine').status{ + options = { + theme = 'gruvbox', + section_separators = {'', ''}, + component_separators = {'', ''}, + icons_enabled = true, + }, + sections = { + lualine_a = { {'mode', upper = true} }, + lualine_b = { {'branch', icon = ''} }, + lualine_c = { {'filename', file_status = true} }, + lualine_x = { 'encoding', 'fileformat', 'filetype' }, + lualine_y = { 'progress' }, + lualine_z = { 'location' }, + }, + inactive_sections = { + lualine_a = { }, + lualine_b = { }, + lualine_c = { 'filename' }, + lualine_x = { 'location' }, + lualine_y = { }, + lualine_z = { } + }, + extensions = { 'fzf' } } - lualine.inactive_sections = { - lualine_a = { }, - lualine_b = { }, - lualine_c = { 'filename' }, - lualine_x = { 'location' }, - lualine_y = { }, - lualine_z = { } - } - lualine.extensions = { 'fzf' } - lualine.status() end } < @@ -440,33 +440,32 @@ FULL CONFIG EXAMPLE INSIDE VIML *lualine_full_config_example_inside_viml* vimrc config > - lua << EOF - local lualine = require('lualine') - lualine.options = { - theme = 'gruvbox', - section_separators = {'', ''}, - component_separators = {'', ''}, - icons_enabled = true, - } - lualine.sections = { - lualine_a = { 'mode' }, - lualine_b = { 'branch' }, - lualine_c = { 'filename' }, - lualine_x = { 'encoding', 'fileformat', 'filetype' }, - lualine_y = { 'progress' }, - lualine_z = { 'location' }, - } - lualine.inactive_sections = { - lualine_a = { }, - lualine_b = { }, - lualine_c = { 'filename' }, - lualine_x = { 'location' }, - lualine_y = { }, - lualine_z = { } - } - lualine.extensions = { 'fzf' } - lualine.status() - EOF + let g:lualine = { + \'options' : { + \ 'theme' : 'gruvbox', + \ 'section_separators' : ['', ''], + \ 'component_separators' : ['', ''], + \ 'icons_enabled' : v:true, + \}, + \'sections' : { + \ 'lualine_a' : [ ['mode', {'upper': v:true,},], ], + \ 'lualine_b' : [ ['branch', {'icon': '',}, ], ], + \ 'lualine_c' : [ ['filename', {'file_status': v:true,},], ], + \ 'lualine_x' : [ 'encoding', 'fileformat', 'filetype' ], + \ 'lualine_y' : [ 'progress' ], + \ 'lualine_z' : [ 'location' ], + \}, + \'inactive_sections' : { + \ 'lualine_a' : [ ], + \ 'lualine_b' : [ ], + \ 'lualine_c' : [ 'filename' ], + \ 'lualine_x' : [ 'location' ], + \ 'lualine_y' : [ ], + \ 'lualine_z' : [ ], + \}, + \'extensions' : [ 'fzf' ], + \} + lua require("lualine").status() < -------------------------------------------------------------------------------- diff --git a/lua/lualine.lua b/lua/lualine.lua index dfa4d16..3f73257 100644 --- a/lua/lualine.lua +++ b/lua/lualine.lua @@ -35,8 +35,33 @@ M.inactive_sections = { lualine_z = { } } -M.extensions = { -} +M.extensions = { } + +local function apply_configuration(config_table) + if not config_table then return end + local function parse_sections(section_group_name) + if not config_table[section_group_name] then return end + for section_name, section in pairs(config_table[section_group_name]) do + M[section_group_name][section_name] = config_table[section_group_name][section_name] + if type(section) == 'table' then + for _, component in pairs(section) do + if type(component) == 'table' and type(component[2]) == 'table' then + local options = component[2] + component[2] = nil + for key, val in pairs(options) do + component[key] = val + end + end + end + end + end + end + parse_sections('options') + parse_sections('sections') + parse_sections('inactive_sections') + if config_table.extensions then M.extensions = config_table.extensions end +end + local function check_single_separator() local compoennt_separator = M.options.component_separators @@ -271,7 +296,9 @@ local function exec_autocommands() ]], false) end -function M.status() +function M.status(config) + apply_configuration(vim.g.lualine) + apply_configuration(config) check_single_separator() lualine_set_theme() exec_autocommands() diff --git a/lua/lualine/highlight.lua b/lua/lualine/highlight.lua index b21a1a1..5fa8f91 100644 --- a/lua/lualine/highlight.lua +++ b/lua/lualine/highlight.lua @@ -142,7 +142,7 @@ end -- @param left_section_data :(string) section before separator -- @param right_section_data:(string) section after separator -- @param reverse :(string) Whether it's a left separator or right separator --- '▶️' and '◀️' needs reverse colors so this parameter needs to be set true. +-- '▶️' and '◀️' needs reverse colors so this parameter needs to be set true. -- @return: (string) formated highlight group name function M.get_transitional_highlights(left_section_data, right_section_data, reverse ) local left_highlight_name, right_highlight_name @@ -168,16 +168,16 @@ function M.get_transitional_highlights(left_section_data, right_section_data, re right_highlight_name = 'lualine_c_normal' end end - -- When both left and right highlights are same nothing to transition to + -- When both left and right highlights are same nothing to transition to if left_highlight_name == right_highlight_name then return end - -- construct the name of hightlight group + -- construct the name of hightlight group local highlight_name - if left_highlight_name:find('lualine_') == 1 then - highlight_name = left_highlight_name .. '_to_' .. right_highlight_name - else - highlight_name = 'lualine_' .. left_highlight_name .. '_to_' .. right_highlight_name - end + if left_highlight_name:find('lualine_') == 1 then + highlight_name = left_highlight_name .. '_to_' .. right_highlight_name + else + highlight_name = 'lualine_' .. left_highlight_name .. '_to_' .. right_highlight_name + end if not utils.highlight_exists(highlight_name) then -- Create the highlight_group if needed @@ -188,12 +188,12 @@ function M.get_transitional_highlights(left_section_data, right_section_data, re local bg = utils.extract_highlight_colors(right_highlight_name, 'guibg') if not fg then fg = 'none' end if not bg then bg = 'none' end - -- swap the bg and fg when reverse is true. As in that case highlight will - -- be placed before section - if reverse then fg, bg = bg, fg end + -- swap the bg and fg when reverse is true. As in that case highlight will + -- be placed before section + if reverse then fg, bg = bg, fg end highlight(highlight_name, fg, bg) end - -- Create highlights and setup to survive colorscheme changes + -- Create highlights and setup to survive colorscheme changes set_transitional_highlights() utils.expand_set_theme(set_transitional_highlights) end