From 34a94913f37d9db03489f4a4a86ef63e2fa07c14 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Sun, 24 Mar 2024 16:24:33 +0200 Subject: [p/heirline] Added statusline config --- lua/plugins/heirline.lua | 159 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 lua/plugins/heirline.lua (limited to 'lua/plugins') diff --git a/lua/plugins/heirline.lua b/lua/plugins/heirline.lua new file mode 100644 index 0000000..126066a --- /dev/null +++ b/lua/plugins/heirline.lua @@ -0,0 +1,159 @@ +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 ]=]-- + +require("heirline").setup({ + statusline = StatusLine, +}) -- cgit v1.3.1-23-gd82d