vim/lualine: split defintion of components from lualine setup

This commit is contained in:
Fernando Schauenburg 2023-08-12 01:33:09 +02:00
parent 146ccc2d8f
commit 6732736fa4
3 changed files with 165 additions and 149 deletions

View file

@ -0,0 +1,124 @@
local M = {}
local window = require('fschauen.window')
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
end
local diff = colored_when_focused('lualine.components.diff')
local branch = {
'branch',
icon = '',
cond = window.is_medium,
}
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 paste = {
function() return '' end,
color = { bg = '#fe8019' },
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 = '#eee8d5',
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
else
return ''
end
end
local default = {
lualine_a = {},
lualine_b = { visual_multi, branch },
lualine_c = { diff, filename, status },
lualine_x = { filetype },
lualine_y = { fileformat, 'progress' },
lualine_z = { 'location' },
}
M.sections = {
inactive = default,
active = vim.tbl_extend('force', default, {
lualine_a = vim.list_extend({ paste, mode }, default.lualine_a),
lualine_x = vim.list_extend({ 'diagnostics' }, default.lualine_x),
})
}
return M

View file

@ -1,139 +1,21 @@
local config = function() return {
local get_mode_icon = function() 'nvim-lualine/lualine.nvim',
local MODES = { opts = function()
['n'] = '', -- 'Normal ', -- Normal return {
['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 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
end
local window_is_at_least = function(width)
return function() return vim.fn.winwidth(0) > width end
end
local window_is_wide = window_is_at_least(80)
local window_is_medium = window_is_at_least(50)
local my = {
paste = {
function() return '' end,
color = { bg = '#bbaa00' },
cond = function()
return vim.opt.paste:get()
end
},
diff = colored_when_focused('lualine.components.diff'),
mode = { get_mode_icon() },
visual_multi = 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,
branch = {
'branch',
icon = '',
cond = window_is_medium,
},
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 = '#eee8d5', gui = 'bold' },
},
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},
},
filetype = {
colored_when_focused('lualine.components.filetype'),
cond = window_is_medium,
},
fileformat = {
'fileformat',
cond = window_is_medium,
},
}
local inactive_sections = {
lualine_a = {},
lualine_b = { my.visual_multi, my.branch },
lualine_c = { my.diff, my.filename, my.status },
lualine_x = { my.filetype },
lualine_y = { my.fileformat, 'progress' },
lualine_z = { 'location' },
}
local active_sections = vim.tbl_extend('force', inactive_sections, {
lualine_a = vim.list_extend({ my.paste, my.mode }, inactive_sections.lualine_a),
lualine_x = vim.list_extend({ 'diagnostics' }, inactive_sections.lualine_x),
})
require('lualine').setup {
options = { options = {
icons_enabled = true, icons_enabled = true,
component_separators = { left = '', right = '' }, component_separators = {
section_separators = { left = '', right = '' }, left = '',
right = ''
},
section_separators = {
left = '',
right = ''
},
theme = 'gruvbox', theme = 'gruvbox',
}, },
sections = require('fschauen.lualine').sections.active,
sections = active_sections, inactive_sections = require('fschauen.lualine').sections.inactive,
inactive_sections = inactive_sections,
extensions = { extensions = {
'fugitive', 'fugitive',
'quickfix', 'quickfix',
@ -143,10 +25,6 @@ local config = function()
'trouble', 'trouble',
}, },
} }
end end
return {
'nvim-lualine/lualine.nvim',
config = config,
} }

View file

@ -1,4 +1,18 @@
M = {} local M = {}
---Determine whether the window is wide.
---@param win_nr integer|nil: window number or window-ID, 0 for current window.
---@return boolean
M.is_wide = function(win_nr)
return vim.fn.winwidth(win_nr or 0) > 80
end
---Determine whether the window is medium.
---@param win_nr integer|nil: window number or window-ID, 0 for current window.
---@return boolean
M.is_medium = function(win_nr)
return vim.fn.winwidth(win_nr or 0) > 50
end
---Whether the current window is the last in a given direction. ---Whether the current window is the last in a given direction.
---@param direction string: one of 'h', 'j', 'k', or 'l' ---@param direction string: one of 'h', 'j', 'k', or 'l'