-- 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 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