vim/lualine: fix filename italics and refactor component extensions

This commit is contained in:
Fernando Schauenburg 2023-08-13 00:40:30 +02:00
parent 0ef1cba81f
commit 31b9a726eb
3 changed files with 167 additions and 124 deletions

View file

@ -1,134 +1,100 @@
local M = {}
local filename = require('lualine.component'):extend()
local window = require('fschauen.window')
function filename:init(options)
filename.super.init(self, options)
local colored_when_focused = function(component)
local new = require(component):extend()
function new:update_status(is_focused)
self.options.colored = is_focused
return self.super.update_status(self, is_focused)
end
return new
local color = options.color or {}
local modified = { gui = 'italic' }
self.custom_highlights = { -- [is_focused, modified]
[true] = {
[true] = self:create_hl(vim.tbl_extend('force', color, modified), 'focus_modified'),
[false] = self:create_hl(color, 'focus'),
},
[false] = {
[true] = self:create_hl(modified, 'nofocus_modified'),
[false] = self:create_hl({}, 'nofocus'),
},
}
end
local diagnostics = colored_when_focused('lualine.components.diagnostics')
function filename:update_status(is_focused)
self.options.color_highlight = self.custom_highlights[is_focused][vim.bo.modified]
local branch = {
'branch',
icon = '',
cond = window.is_medium,
}
local window = require 'fschauen.window'
local path = vim.fn.expand('%:~:.')
local fileformat = {
'fileformat',
cond = window.is_medium,
}
local filename = {
function()
local shorten_path = function(path)
if window.is_wide() then
return path
elseif window.is_medium() then
return vim.fn.pathshorten(path) -- only first letter of directories
else
return vim.fn.fnamemodify(path, ':t') -- only tail
end
end
return shorten_path(vim.fn.expand('%:~:.'))
end,
padding = { left = 1, right = 0 },
}
local filetype = {
colored_when_focused('lualine.components.filetype'),
cond = window.is_medium,
}
local mode = {
(function()
local MODES = {
['n'] = '', -- 'Normal ', -- Normal
['no'] = '', -- 'O-Pend ', -- Operator-pending
['ni'] = '', -- 'Normal ', -- Normal via i_CTRL-O
['v'] = ' 󰒉 ', -- 'Visual ', -- Visual by character
[''] = ' 󰩭 ', -- 'V-Block', -- Visual blockwise
['s'] = ' 󰒉 ', -- 'Select ', -- Select by character
[''] = ' 󰩭 ', -- 'S-Block', -- Select blockwise
['i'] = '', -- 'Insert ', -- Insert
['r'] = ' 󰄾 ', -- 'Replace', -- Replace
['rv'] = ' 󰶻 ', -- 'V-Repl ', -- Virtual Replace
['c'] = '', -- 'Command', -- Command-line
['cv'] = '', -- ' Ex ', -- Ex mode
['rm'] = '', -- ' More ', -- -- MORE --
['r?'] = ' 󰭚 ', -- 'Confirm', -- :confirm
['!'] = '', -- ' Shell ', -- External command executing
['t'] = '', -- ' Term ', -- Terminal
}
return function()
local code = vim.api.nvim_get_mode().mode
return MODES[code:sub(1, 2):lower()] or MODES[code:sub(1, 1):lower()] or code
end
end)()
}
local mode_placeholder = {
function()
return ' 󰒲 '
end
}
local paste = {
function() return '' end,
color = { bg = '#fe8019' },
cond = function() return vim.opt.paste:get() end
}
local paste_placeholder = {
function() return ' ' end,
cond = function() return vim.opt.paste:get() end
}
local status = {
function()
local flags = vim.list_extend(
vim.bo.modified and { '' } or {},
(vim.bo.readonly or not vim.bo.modifiable) and { 'RO' } or {})
return vim.fn.join(flags, ' ')
end,
color = {
fg = '#f9f5d7',
gui = 'bold',
},
}
local visual_multi = function()
local info = vim.F.npcall(vim.fn.VMInfos)
if info and info.status then
return info.current .. '/' .. info.total .. ' ' .. info.status
if window.is_wide() then
return path
elseif window.is_medium() then
return vim.fn.pathshorten(path) -- only first letter of directories
else
return ''
return vim.fn.fnamemodify(path, ':t') -- only tail
end
end
local default = {
lualine_a = { paste_placeholder, mode_placeholder },
lualine_b = { visual_multi, branch },
lualine_c = { filename, status },
lualine_x = { diagnostics, filetype },
lualine_y = { fileformat, 'progress' },
lualine_z = { 'location' },
local mode = require('lualine.component'):extend()
mode.map = {
['n'] = '', -- 'Normal ', -- Normal
['no'] = '', -- 'O-Pend ', -- Operator-pending
['ni'] = '', -- 'Normal ', -- Normal via i_CTRL-O
['v'] = '󰒉', -- 'Visual ', -- Visual by character
[''] = '󰩭', -- 'V-Block', -- Visual blockwise
['s'] = '󰒉', -- 'Select ', -- Select by character
[''] = '󰩭', -- 'S-Block', -- Select blockwise
['i'] = '', -- 'Insert ', -- Insert
['r'] = '󰄾', -- 'Replace', -- Replace
['rv'] = '󰶻', -- 'V-Repl ', -- Virtual Replace
['c'] = '', -- 'Command', -- Command-line
['cv'] = '', -- ' Ex ', -- Ex mode
['rm'] = '', -- ' modeore ', -- -- modeORE --
['r?'] = '󰭚', -- 'Confirm', -- :confirm
['!'] = '', -- ' Shell ', -- External command executing
['t'] = '', -- ' Term ', -- Terminal
}
M.sections = {
inactive = default,
active = vim.tbl_extend('force', default, {
lualine_a = { paste, mode },
})
function mode:update_status(is_focused)
if is_focused then
local code = vim.api.nvim_get_mode().mode:lower()
local symbol = mode.map[code:sub(1, 2)] or mode.map[code:sub(1, 1)] or code
return ' ' .. symbol .. ' '
end
return ' 󰒲 '
end
local colored_if_focused = function(component)
if type(component) == 'string' then
local c = require('lualine.components.' .. component):extend()
function c:update_status(is_focused)
self.options.colored = is_focused
return c.super.update_status(self, is_focused)
end
return c
elseif type(component) == 'function' then
local c = require('lualine.component'):extend()
function c:init(options)
c.super.init(self, options)
self.saved_hl = self.options.color_highlight
end
function c:update_status(is_focused)
self.options.color_highlight = is_focused and self.saved_hl or nil
return component(is_focused)
end
return c
end
end
return {
colored_if_focused = colored_if_focused,
filename = filename,
mode = mode,
}
return M

View file

@ -1,7 +1,73 @@
return {
'nvim-lualine/lualine.nvim',
opts = function()
return {
config = function()
local window = require 'fschauen.window'
local colored_if_focused = require('fschauen.lualine').colored_if_focused
-- custom components
local C = {
diagnostics = {
colored_if_focused('diagnostics'),
},
diff = {
colored_if_focused('diff'),
symbols = {
added = '',
modified = '',
removed = '',
},
},
branch = {
'branch',
icon = '󰘬',
cond = window.is_medium,
},
fileformat = {
'fileformat',
cond = window.is_medium,
},
filename = {
require('fschauen.lualine').filename,
padding = {
left = 1,
right = 0,
},
},
filetype = {
colored_if_focused('filetype'),
cond = window.is_medium,
},
mode = require('fschauen.lualine').mode,
paste = {
colored_if_focused(function(has_focus) return has_focus and '' or ' ' end),
color = {
bg = '#fe8019',
},
cond = function() return vim.o.paste end
},
status = {
colored_if_focused(function(_)
local status = ''
if vim.bo.modified then status = status .. '' end
if vim.bo.readonly or not vim.bo.modifiable then status = status .. 'RO' end
return status
end),
color = {
fg = '#f9f5d7',
},
},
}
local sections = {
lualine_a = { C.paste, C.mode },
lualine_b = { C.branch },
lualine_c = { C.filename, C.status },
lualine_x = { C.diagnostics, C.filetype },
lualine_y = { C.fileformat, 'progress' },
lualine_z = { 'location' },
}
require('lualine').setup {
options = {
icons_enabled = true,
component_separators = {
@ -14,8 +80,8 @@ return {
},
theme = 'gruvbox',
},
sections = require('fschauen.lualine').sections.active,
inactive_sections = require('fschauen.lualine').sections.inactive,
sections = sections,
inactive_sections = sections,
extensions = {
'fugitive',
'quickfix',

View file

@ -6,3 +6,14 @@ return {
end,
}
-- Component for lualine:
-- function()
-- local info = vim.F.npcall(vim.fn.VMInfos)
-- if info and info.status then
-- return info.current .. '/' .. info.total .. ' ' .. info.status
-- else
-- return ''
-- end
-- end,