marleyvim/nvim/lua/lib/lazyvim/lualine.lua

156 lines
4.1 KiB
Lua
Raw Normal View History

2024-11-30 12:51:28 -08:00
-- https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/util/lualine.lua
local lazy_util = require('lib.lazy.util')
local lazyvim_root = require('lib.lazyvim.root')
local lazyvim_ui = require('lib.lazyvim.ui')
---@class lib.lazyvim.lualine
local M = {}
---@param component any
---@param text string
---@param hl_group? string
---@return string
function M.format(component, text, hl_group)
text = text:gsub('%%', '%%%%')
if not hl_group or hl_group == '' then
return text
end
---@type table<string, string>
component.hl_cache = component.hl_cache or {}
local lualine_hl_group = component.hl_cache[hl_group]
if not lualine_hl_group then
local utils = require('lualine.utils.utils')
---@type string[]
local gui = vim.tbl_filter(function(x)
return x
end, {
utils.extract_highlight_colors(hl_group, 'bold') and 'bold',
utils.extract_highlight_colors(hl_group, 'italic') and 'italic',
})
lualine_hl_group = component:create_hl({
fg = utils.extract_highlight_colors(hl_group, 'fg'),
gui = #gui > 0 and table.concat(gui, ',') or nil,
}, 'LV_' .. hl_group) --[[@as string]]
component.hl_cache[hl_group] = lualine_hl_group
end
return component:format_hl(lualine_hl_group)
.. text
.. component:get_default_hl()
end
---@param opts? {relative: "cwd"|"root", modified_hl: string?, directory_hl: string?, filename_hl: string?, modified_sign: string?, readonly_icon: string?, length: number?}
function M.pretty_path(opts)
opts = vim.tbl_extend('force', {
relative = 'cwd',
modified_hl = 'MatchParen',
directory_hl = '',
filename_hl = 'Bold',
modified_sign = '',
readonly_icon = ' 󰌾 ',
length = 3,
}, opts or {})
return function(self)
local path = vim.fn.expand('%:p') --[[@as string]]
if path == '' then
return ''
end
path = lazy_util.norm(path)
local root = lazyvim_root.get({ normalize = true })
local cwd = lazyvim_root.cwd()
if opts.relative == 'cwd' and path:find(cwd, 1, true) == 1 then
path = path:sub(#cwd + 2)
elseif path:find(root, 1, true) == 1 then
path = path:sub(#root + 2)
end
local sep = package.config:sub(1, 1)
local parts = vim.split(path, '[\\/]')
if opts.length == 0 then
parts = parts
elseif #parts > opts.length then
parts =
{ parts[1], '', unpack(parts, #parts - opts.length + 2, #parts) }
end
if opts.modified_hl and vim.bo.modified then
parts[#parts] = parts[#parts] .. opts.modified_sign
parts[#parts] = M.format(self, parts[#parts], opts.modified_h1)
else
parts[#parts] = M.format(self, parts[#parts], opts.filename_hl)
end
local dir = ''
if #parts > 1 then
dir = table.concat({ unpack(parts, 1, #parts - 1) }, sep)
dir = M.format(self, dir .. sep, opts.directory_hl)
end
local readonly = ''
if vim.bo.readonly then
readonly = M.format(self, opts.readonly_icon, opts.modified_hl)
end
return dir .. parts[#parts] .. readonly
end
end
---@param opts? {cwd:false, subdirectory:true, parent:true, other:true, icon?:string}
function M.root_dir(opts)
opts = vim.tbl_extend('force', {
cwd = false,
subdirectory = true,
parent = true,
other = true,
icon = '󱉭 ',
color = function()
return lazyvim_ui.fg('Special')
end,
}, opts or {})
local function get()
local cwd = lazyvim_root.cwd()
local root = lazyvim_root.get({ normalize = true })
local name = vim.fs.basename(root)
if root == cwd then
return opts.cwd and name
elseif root:find(cwd, 1, true) == 1 then
-- Root is subdirectory or cwd.
return opts.subdirectory and name
elseif cwd:find(root, 1, true) == 1 then
-- Root is parent directory of cwd.
return opts.parent and name
else
-- Root and cwd are not related.
return opts.other and name
end
end
return {
function()
return (opts.icon and opts.icon .. ' ') .. get()
end,
cond = function()
return type(get()) == 'string'
end,
color = opts.color,
}
end
return M