From 033a0033bdf5e9309a80748ebbfd8f6b6d527852 Mon Sep 17 00:00:00 2001 From: quirinecker Date: Mon, 17 Nov 2025 19:54:31 +0100 Subject: [PATCH] found match for the statusline after a lot of research and styled it --- .../neovim/lua/plugins/config/heirline.lua | 246 ++++++++++++++++++ .../lua/plugins/config/mini_statusline.lua | 29 +++ .../neovim/lua/plugins/config/staline.lua | 49 ++++ .../neovim/lua/plugins/config/witchline.lua | 59 +++++ .../neovim/lua/plugins/spec/heirline.lua | 7 + ...{mini.bracketed.lua => mini_bracketed.lua} | 0 ...ini.statusline.lua => mini_statusline.lua} | 3 +- .../neovim/lua/plugins/spec/staline.lua | 7 + .../neovim/lua/plugins/spec/witchline.lua | 12 + 9 files changed, 411 insertions(+), 1 deletion(-) create mode 100644 homemanager/neovim/lua/plugins/config/heirline.lua create mode 100644 homemanager/neovim/lua/plugins/config/mini_statusline.lua create mode 100644 homemanager/neovim/lua/plugins/config/staline.lua create mode 100644 homemanager/neovim/lua/plugins/config/witchline.lua create mode 100644 homemanager/neovim/lua/plugins/spec/heirline.lua rename homemanager/neovim/lua/plugins/spec/{mini.bracketed.lua => mini_bracketed.lua} (100%) rename homemanager/neovim/lua/plugins/spec/{mini.statusline.lua => mini_statusline.lua} (57%) create mode 100644 homemanager/neovim/lua/plugins/spec/staline.lua create mode 100644 homemanager/neovim/lua/plugins/spec/witchline.lua diff --git a/homemanager/neovim/lua/plugins/config/heirline.lua b/homemanager/neovim/lua/plugins/config/heirline.lua new file mode 100644 index 0000000..8fa9bfc --- /dev/null +++ b/homemanager/neovim/lua/plugins/config/heirline.lua @@ -0,0 +1,246 @@ +local conditions = require("heirline.conditions") +local utils = require("heirline.utils") +local devicons = require("nvim-web-devicons") + +local branch = vim.fn.system("git branch --show-current 2>/dev/null") +branch = branch:gsub("\n", "") + + +local mode_names = { + n = "NORMAL", + no = "OP-PENDING", + nov = "OP-PENDING", + noV = "OP-PENDING", + ["no\22"] = "OP-PENDING", + + niI = "NORMAL", + niR = "NORMAL", + niV = "NORMAL", + + v = "VISUAL", + V = "V-LINE", + ["\22"] = "V-BLOCK", -- CTRL-V + + s = "SELECT", + S = "S-LINE", + ["\19"] = "S-BLOCK", -- CTRL-S + + i = "INSERT", + ic = "INSERT", + ix = "INSERT", + + R = "REPLACE", + Rc = "REPLACE", + Rx = "REPLACE", + Rv = "V-REPLACE", + Rvc = "V-REPLACE", + Rvx = "V-REPLACE", + + c = "COMMAND", + cv = "EX", + ce = "EX", + + r = "ENTER", + rm = "MORE", + ["r?"] = "CONFIRM", + + ["!"] = "SHELL", + t = "TERMINAL", +} + + +local colors = { + bg = "#3B4252", -- Polar Night + fg = "#ECEFF4", -- Snow Storm + red = "#BF616A", -- Aurora + orange = "#D08770", + yellow = "#EBCB8B", + green = "#A3BE8C", + cyan = "#88C0D0", + blue = "#81A1C1", + blue_dark = "#5E81AC", + magenta = "#B48EAD", +} + +local mode_colors = { + n = colors.blue_dark, -- NORMAL + i = colors.green, -- INSERT + v = colors.magenta, -- VISUAL + V = colors.magenta, + ["\22"] = colors.magenta, -- V-BLOCK + + c = colors.yellow, -- COMMAND + s = colors.orange, -- SELECT + S = colors.orange, + R = colors.red, -- REPLACE + r = colors.red, + + t = colors.cyan, -- TERMINAL +} + +local function BorderLeft(color, background) + return { + provider = "", + hl = function() + return { fg = color, bg = background } + end, + } +end + +local function BorderRight(color, background) + return { + provider = "", + hl = function() + return { fg = color, bg = background } + end, + } +end + +local function Mode(color) + return { + provider = function() + return " " .. mode_names[vim.fn.mode()] .. " " + end, + hl = function() + return { bg = color, fg = colors.fg, bold = true } + end, + } +end + +local FileName = { + provider = function() + local name = vim.fn.expand("%:t") + if name == "" then name = "[No Name]" end + return name + end, + hl = { fg = colors.fg, bg = colors.bg }, +} + +local GitBranch = { + -- condition = function(self) + -- return vim.fn.system('git rev-parse --is-inside-work-tree 2>/dev/null') == "true\n" + -- end, + + provider = function(self) + return " " .. branch .. " " + end, + + hl = { fg = colors.blue, bg = colors.bg }, +} + + + +local FileIcon = { + init = function(self) + self.filename = vim.fn.expand("%:t") + self.extension = vim.fn.expand("%:e") + self.icon, self.icon_color = devicons.get_icon_color(self.filename, self.extension, { default = true }) + end, + + provider = function(self) + return " " .. self.icon .. " " + end, + + hl = function(self) + return { fg = self.icon_color, bg = colors.bg } + end, +} + +function SimpleSeperator(foreground, background) + return { + provider = function() + return " | " + end, + hl = function() + return { fg = foreground, bg = background } + end, + } +end + +-- local Lsp = { +-- condition = function() +-- return #vim.lsp.get_active_clients({ bufnr = 0 }) > 0 +-- end, +-- provider = "  LSP ", +-- hl = { fg = colors.green }, +-- } +-- + +local function Diagnostics(background) + return { + condition = function() + return vim.diagnostic.is_enabled() + end, + + init = function(self) + self.errors = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.ERROR }) + self.warnings = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.WARN }) + self.info = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.INFO }) + self.hints = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.HINT }) + end, + + { + -- condition = function(self) return self.errors > 0 end, + provider = function(self) return " " .. self.errors .. " " end, + hl = { fg = colors.red, bg = background }, + }, + { + -- condition = function(self) return self.warnings > 0 end, + provider = function(self) return " " .. self.warnings .. " " end, + hl = { fg = colors.yellow, bg = background }, + }, + { + -- condition = function(self) return self.info > 0 end, + provider = function(self) return " " .. self.info .. " " end, + hl = { fg = colors.blue, bg = background }, + }, + { + -- condition = function(self) return self.hints > 0 end, + provider = function(self) return " " .. self.hints .. " " end, + hl = { fg = colors.cyan, bg = background }, + }, + } +end + +local FileType = { + provider = function() + return " " .. vim.bo.filetype .. " " + end, + hl = { fg = colors.fg, bg = colors.bg }, +} + +local function FilePercentage(background) + return { + provider = function() + local current = vim.fn.line(".") -- current line + local total = vim.fn.line("$") -- total lines + if total == 0 then return "Top" end + local percent = math.floor((current / total) * 100) + return percent .. "%%" + end, + hl = { fg = colors.fg, bg = background, bold = true }, + } +end + +local DefaultStatusline = { + BorderLeft(colors.blue), + Mode(colors.blue), + BorderRight(colors.blue, colors.bg), + FileIcon, + FileName, + SimpleSeperator(colors.fg, colors.bg), + GitBranch, + BorderRight(colors.bg), + { provider = "%=" }, + + BorderLeft(colors.bg), + FileIcon, + FileType, + SimpleSeperator(colors.fg, colors.bg), + Diagnostics(colors.bg), + BorderLeft(colors.blue, colors.bg), + FilePercentage(colors.blue), + BorderRight(colors.blue), +} + +require("heirline").setup({ statusline = DefaultStatusline }) diff --git a/homemanager/neovim/lua/plugins/config/mini_statusline.lua b/homemanager/neovim/lua/plugins/config/mini_statusline.lua new file mode 100644 index 0000000..d246f8e --- /dev/null +++ b/homemanager/neovim/lua/plugins/config/mini_statusline.lua @@ -0,0 +1,29 @@ +local function setup_content() + local MiniStatusline = require('mini.statusline') + local mode, mode_hl = MiniStatusline.section_mode({ trunc_width = 120 }) + local git = MiniStatusline.section_git({ trunc_width = 40 }) + local diff = MiniStatusline.section_diff({ trunc_width = 75 }) + local diagnostics = MiniStatusline.section_diagnostics({ trunc_width = 75 }) + local lsp = MiniStatusline.section_lsp({ trunc_width = 75 }) + local filename = MiniStatusline.section_filename({ trunc_width = 140 }) + local fileinfo = MiniStatusline.section_fileinfo({ trunc_width = 120 }) + local location = MiniStatusline.section_location({ trunc_width = 75 }) + local search = MiniStatusline.section_searchcount({ trunc_width = 75 }) + + print(filename) + return MiniStatusline.combine_groups({ + { hl = mode_hl, strings = { mode } }, + { hl = 'MiniStatuslineDevinfo', strings = { git, diff, diagnostics, lsp } }, + '%<', -- Mark general truncate point + { hl = 'MiniStatuslineFilename', strings = { filename } }, + '%=', -- End left alignment + { hl = 'MiniStatuslineFileinfo', strings = { fileinfo } }, + { hl = mode_hl, strings = { search, location } }, + }) +end + +require('mini.statusline').setup({ + content = { + active = setup_content + } +}) diff --git a/homemanager/neovim/lua/plugins/config/staline.lua b/homemanager/neovim/lua/plugins/config/staline.lua new file mode 100644 index 0000000..bca8904 --- /dev/null +++ b/homemanager/neovim/lua/plugins/config/staline.lua @@ -0,0 +1,49 @@ +require('staline').setup { + defaults = { + expand_null_ls = false, -- This expands out all the null-ls sources to be shown + left_separator = ' ', + right_separator = " ", + full_path = false, + line_column = "[%l/%L] :%c 並%p%% ", -- `:h stl` to see all flags. + + fg = "#000000", -- Foreground text color. + bg = "none", -- Default background is transparent. + inactive_color = "#303030", + inactive_bgcolor = "none", + true_colors = false, -- true lsp colors. + font_active = "none", -- "bold", "italic", "bold,italic", etc + + mod_symbol = "  ", + lsp_client_symbol = " ", + lsp_client_character_length = 12, -- Shorten LSP client names. + branch_symbol = " ", + cool_symbol = " ", -- Change this to override default OS icon. + null_ls_symbol = "", -- A symbol to indicate that a source is coming from null-ls + }, + mode_icons = { + n = " ", + i = " ", + c = " ", + v = " ", -- etc.. + }, + sections = { + left = { '- ', '-mode', 'left_sep_double', ' ', 'branch', 'file_name' }, + mid = {}, + right = { 'cool_symbol', 'right_sep_double', '-line_column' }, + }, + inactive_sections = { + left = { 'branch', 'file_name' }, + mid = { 'file_name' }, + right = { 'line_column' } + }, + special_table = { + NvimTree = { 'NvimTree', ' ' }, + packer = { 'Packer', ' ' }, -- etc + }, + lsp_symbols = { + Error = " ", + Info = " ", + Warn = " ", + Hint = "", + }, +} diff --git a/homemanager/neovim/lua/plugins/config/witchline.lua b/homemanager/neovim/lua/plugins/config/witchline.lua new file mode 100644 index 0000000..fe5be40 --- /dev/null +++ b/homemanager/neovim/lua/plugins/config/witchline.lua @@ -0,0 +1,59 @@ +require("witch-line").setup({ + abstracts = { + "file.name", + { + id = "file", -- Abstract component for file-related info + padding = { left = 1, right = 1 }, -- Padding around the component + static = { some_key = "some_value" }, -- Static metadata + style = { fg = "#ffffff", bg = "#000000", bold = true }, -- Style override + min_screen_width = 80, -- Hide if screen width < 80 + }, + }, + + statusline = { + --- The global statusline components + global = { + "mode", + "file.name", + "git.branch", + -- { + -- id = "component_id", -- Unique identifier + -- padding = { left = 1, right = 1 }, -- Padding around the component + -- static = { some_key = "some_value" }, -- Static metadata + -- win_individual = false, + -- timing = false, -- No timing updates + -- style = { fg = "#ffffff", bg = "#000000", bold = true }, -- Style override + -- min_screen_width = 80, -- Hide if screen width < 80 + -- hidden = function() -- Hide condition + -- return vim.bo.buftype == "nofile" + -- end, + -- left_style = { fg = "#ff0000" }, -- Left style override + -- update = function(self, ctx, static, session_id) -- Main content generator + -- return vim.fn.expand("%:t") + -- end, + -- ref = { -- References to other components + -- events = { "file.name" }, + -- style = "file.name", + -- static = "file.name", + -- }, + -- }, + }, + + -- @type fun(winid): CombinedComponent[]|nil + win = nil + }, + + cache = { + -- Perform full plugin scan for cache expiration. Default false. + full_scan = false, + -- Show notification when cache is cleared. Default true. + notification = true, + -- Strip debug info when caching dumped functions. Default false. + func_strip = false, + }, + + disabled = { + filetypes = { "help", "TelescopePrompt" }, + buftypes = { "nofile", "terminal" }, + }, +}) diff --git a/homemanager/neovim/lua/plugins/spec/heirline.lua b/homemanager/neovim/lua/plugins/spec/heirline.lua new file mode 100644 index 0000000..d55ae6b --- /dev/null +++ b/homemanager/neovim/lua/plugins/spec/heirline.lua @@ -0,0 +1,7 @@ +return { + "rebelot/heirline.nvim", + config = function() + require("plugins.config.heirline") + end, +} + diff --git a/homemanager/neovim/lua/plugins/spec/mini.bracketed.lua b/homemanager/neovim/lua/plugins/spec/mini_bracketed.lua similarity index 100% rename from homemanager/neovim/lua/plugins/spec/mini.bracketed.lua rename to homemanager/neovim/lua/plugins/spec/mini_bracketed.lua diff --git a/homemanager/neovim/lua/plugins/spec/mini.statusline.lua b/homemanager/neovim/lua/plugins/spec/mini_statusline.lua similarity index 57% rename from homemanager/neovim/lua/plugins/spec/mini.statusline.lua rename to homemanager/neovim/lua/plugins/spec/mini_statusline.lua index 4ac4b25..7c432ad 100644 --- a/homemanager/neovim/lua/plugins/spec/mini.statusline.lua +++ b/homemanager/neovim/lua/plugins/spec/mini_statusline.lua @@ -1,7 +1,8 @@ return { 'nvim-mini/mini.statusline', version = '*', + enabled = false, config = function() - require('mini.statusline').setup() + require('plugins.config.mini_statusline') end } diff --git a/homemanager/neovim/lua/plugins/spec/staline.lua b/homemanager/neovim/lua/plugins/spec/staline.lua new file mode 100644 index 0000000..7876c34 --- /dev/null +++ b/homemanager/neovim/lua/plugins/spec/staline.lua @@ -0,0 +1,7 @@ +return { + 'tamton-aquib/staline.nvim', + enabled = false, + config = function() + require('plugins.config.staline') + end +} diff --git a/homemanager/neovim/lua/plugins/spec/witchline.lua b/homemanager/neovim/lua/plugins/spec/witchline.lua new file mode 100644 index 0000000..62164a6 --- /dev/null +++ b/homemanager/neovim/lua/plugins/spec/witchline.lua @@ -0,0 +1,12 @@ +return { + "sontungexpt/witch-line", + dependencies = { + "nvim-tree/nvim-web-devicons", + }, + lazy = false, -- Almost component is lazy load by default. So you can set lazy to false + enabled = false, + config = function() + vim.o.laststatus = 3 + require("plugins.config.witchline") + end, +}