return { "rebelot/heirline.nvim", lazy = false, opts = function() local utils = require("heirline.utils") local conditions = require("heirline.conditions") --[=[ Helpers ]=]-- function inverseColors(highlight) if highlight == nil then return nil end if type(highlight) == "string" then highlight = utils.get_highlight(highlight) end highlight.cterm = { reverse = true } return highlight end local delimiters = { FilledCircle = { "", "" }, Circle = { "", "" }, } local StatusLineColor = utils.get_highlight("StatusLine") function surround(delimiters, component) return { init = function(self) local highlight if component.hl ~= nil and type(component.hl) == "function" then if component.init ~= nil then component:init() end highlight = component:hl() else highlight = component.hl end self.inverse = inverseColors(highlight) self.inverse.ctermfg = StatusLineColor.ctermfg -- Actually sets bg, but both are reversed end, { condition = function() return conditions.is_active() end, provider = delimiters[1], hl = function(self) return self.inverse end, }, component, { condition = function() return conditions.is_active() end, provider = delimiters[2], hl = function(self) return self.inverse end, }, update = { "BufEnter", "BufLeave" }, } end --[=[ Common elements ]=]-- local FileStat = { { condition = function() return vim.bo.readonly end, provider = "", }, { condition = function() return vim.bo.modified or not vim.bo.modifiable end, provider = function(self) local prepend = vim.bo.readonly and " " or "" if vim.bo.modified then return prepend.."" end if not vim.bo.modifiable then return prepend.."" end end, }, } local FileType = { static = { get_icon = require("nvim-web-devicons").get_icon_by_filetype, }, provider = function(self) local icon = self.get_icon(vim.bo.filetype) if icon ~= nil then icon = icon.." " else icon = "" end return icon..vim.bo.filetype end, } local Filename = { provider = "%f", } local Space = { provider = " ", } --[=[ Statusline ]=]-- vim.cmd.highlight({ "ModeNormal", "ctermfg=236", "ctermbg=117" }) vim.cmd.highlight({ "ModeInsert", "ctermfg=236", "ctermbg=119" }) vim.cmd.highlight({ "ModeReplace", "ctermfg=236", "ctermbg=203" }) vim.cmd.highlight({ "ModeVisual", "ctermfg=236", "ctermbg=216" }) local Mode = surround(delimiters.FilledCircle, { init = function(self) self.modestr = vim.fn.mode(1) if self.modestr == "\22" then self.modestr = "V^" elseif self.modestr == "\22s" then self.modestr = "V^s" end end, provider = function(self) if not conditions.is_active() then return " " end return self.modestr end, hl = function(self) if not conditions.is_active() then return "StatusLineNC" end local modeletter = self.modestr:sub(1,1):lower() if modeletter == "i" then return "ModeInsert" elseif modeletter == "r" then return "ModeReplace" elseif modeletter == "v" then return "ModeVisual" end return "ModeNormal" end, }) vim.cmd.highlight({ "RowAndColumn", "ctermfg=238", "ctermbg=244" }) local LineAndColumn = surround(delimiters.FilledCircle, { provider = function(self) if not conditions.is_active() then local row,col = unpack(vim.api.nvim_win_get_cursor(0)) return string.rep(" ", 1 + tostring(row):len() + tostring(col):len()) end return "%l:%c" end, hl = function(self) if not conditions.is_active() then return "StatusLineNC" end return "RowAndColumn" end, }) local LeftShrink = { provider = "%<", } local LeftSep = { provider = " "..delimiters.Circle[2].." " } local RightSep = { provider = " "..delimiters.Circle[1].." " } local ExpandMiddle = { provider = "%=", } local CursorChar = { provider = "%b", } local StatusLine = { Mode, LeftShrink, Space, Filename, LeftSep, FileStat, ExpandMiddle, CursorChar, RightSep, FileType, Space, LineAndColumn } --[=[ Setup ]=]-- return { statusline = StatusLine, } end, }