local folder_icon = "󰉋" local M = {} --- Window bar that shows the current file path (in a fancy way). ---@return string function M.render() -- Get the path and expand variables. local path = vim.fs.normalize(vim.fn.expand '%:p' --[[@as string]]) -- Replace slashes by arrows. local separator = ' %#WinbarSeparator# ' local prefix, prefix_path = '', '' -- If the window gets too narrow, shorten the path and drop the prefix. if vim.api.nvim_win_get_width(0) < math.floor(vim.o.columns / 3) then path = vim.fn.pathshorten(path) else -- For some special folders, add a prefix instead of the full path (making -- sure to pick the longest prefix). ---@type table local special_dirs = { DOTFILES = "/Users/afonso/.config", HOME = vim.env.HOME, PROJECTS = "/Users/afonso/projects", ["University"] = "/Users/afonso/projects/University", ["Personal"] = "/Users/afonso/projects/Personal", } for dir_name, dir_path in pairs(special_dirs) do if vim.startswith(path, vim.fs.normalize(dir_path)) and #dir_path > #prefix_path then prefix, prefix_path = dir_name, dir_path end end if prefix ~= '' then path = path:gsub('^' .. prefix_path, '') prefix = string.format('%%#WinBarSpecial#%s %s%s', folder_icon, prefix, separator) end end -- Remove leading slash. path = path:gsub('^/', '') -- Get the background color of the Normal highlight group local normal_bg_color = vim.api.nvim_get_hl_by_name('Normal', true).background -- Get the foreground color of the Normal highlight group local normal_fg_color = vim.api.nvim_get_hl_by_name('Normal', true).foreground -- Convert the RGB color to a hex string local bg_hex_color = string.format('#%06x', normal_bg_color) -- Convert the RGB color to a hex string local fg_hex_color = string.format('#%06x', normal_fg_color) -- Define the Winbar highlight group with the same background color vim.api.nvim_command('highlight Winbar guibg=' .. bg_hex_color) -- Define the Winbar highlight group with the same foreground color vim.api.nvim_command('highlight Winbar guifg=' .. fg_hex_color) return table.concat { ' ', prefix, table.concat( vim.iter.map(function(segment) return string.format('%%#Winbar#%s', segment) end, vim.split(path, '/')), separator ), } end vim.api.nvim_create_autocmd('BufWinEnter', { group = vim.api.nvim_create_augroup('mariasolos/winbar', { clear = true }), desc = 'Attach winbar', callback = function(args) if not vim.api.nvim_win_get_config(0).zindex -- Not a floating window and vim.bo[args.buf].buftype == '' -- Normal buffer and vim.api.nvim_buf_get_name(args.buf) ~= '' -- Has a file name and not vim.wo[0].diff -- Not in diff mode then vim.wo.winbar = "%{%v:lua.require'winbar'.render()%}" end end, }) return M