From fa9f9aad0ba9663b254f60e7362bbf1bf8626aaa Mon Sep 17 00:00:00 2001
From: zbirenbaum <zacharyobirenbaum@gmail.com>
Date: Mon, 10 Jan 2022 23:39:37 -0500
Subject: [PATCH] rewrote statusline to be compartmentalized into named
 components and easier to understand/customize as a basis

---
 lua/plugins/configs/statusline.lua | 671 +++++++++++++++--------------
 1 file changed, 357 insertions(+), 314 deletions(-)

diff --git a/lua/plugins/configs/statusline.lua b/lua/plugins/configs/statusline.lua
index 7a8aaa2..500403b 100644
--- a/lua/plugins/configs/statusline.lua
+++ b/lua/plugins/configs/statusline.lua
@@ -3,44 +3,44 @@ local lsp = require "feline.providers.lsp"
 local lsp_severity = vim.diagnostic.severity
 
 local icon_styles = {
-   default = {
-      left = "",
-      right = " ",
-      main_icon = "  ",
-      vi_mode_icon = " ",
-      position_icon = " ",
-   },
-   arrow = {
-      left = "",
-      right = "",
-      main_icon = "  ",
-      vi_mode_icon = " ",
-      position_icon = " ",
-   },
+	default = {
+		left = "",
+		right = " ",
+		main_icon = "  ",
+		vi_mode_icon = " ",
+		position_icon = " ",
+	},
+	arrow = {
+		left = "",
+		right = "",
+		main_icon = "  ",
+		vi_mode_icon = " ",
+		position_icon = " ",
+	},
 
-   block = {
-      left = " ",
-      right = " ",
-      main_icon = "   ",
-      vi_mode_icon = "  ",
-      position_icon = "  ",
-   },
+	block = {
+		left = " ",
+		right = " ",
+		main_icon = "   ",
+		vi_mode_icon = "  ",
+		position_icon = "  ",
+	},
 
-   round = {
-      left = "",
-      right = "",
-      main_icon = "  ",
-      vi_mode_icon = " ",
-      position_icon = " ",
-   },
+	round = {
+		left = "",
+		right = "",
+		main_icon = "  ",
+		vi_mode_icon = " ",
+		position_icon = " ",
+	},
 
-   slant = {
-      left = " ",
-      right = " ",
-      main_icon = "  ",
-      vi_mode_icon = " ",
-      position_icon = " ",
-   },
+	slant = {
+		left = " ",
+		right = " ",
+		main_icon = "  ",
+		vi_mode_icon = " ",
+		position_icon = " ",
+	},
 }
 
 local config = require("core.utils").load_config().plugins.options.statusline
@@ -54,327 +54,370 @@ local shortline = config.shortline == false and true
 
 -- Initialize the components table
 local components = {
-   active = {},
-   inactive = {},
+	active = {},
+	inactive = {},
 }
 
 table.insert(components.active, {})
 table.insert(components.active, {})
 table.insert(components.active, {})
 
-components.active[1][1] = {
-   provider = statusline_style.main_icon,
+local get_components = function()
+	local M = {}
 
-   hl = {
-      fg = colors.statusline_bg,
-      bg = colors.nord_blue,
-   },
+	M.main_icon = {
+		provider = statusline_style.main_icon,
 
-   right_sep = { str = statusline_style.right, hl = {
-      fg = colors.nord_blue,
-      bg = colors.lightbg,
-   } },
-}
+		hl = {
+			fg = colors.statusline_bg,
+			bg = colors.nord_blue,
+		},
 
-components.active[1][2] = {
-   provider = function()
-      local filename = vim.fn.expand "%:t"
-      local extension = vim.fn.expand "%:e"
-      local icon = require("nvim-web-devicons").get_icon(filename, extension)
-      if icon == nil then
-         icon = " "
-         return icon
-      end
-      return " " .. icon .. " " .. filename .. " "
-   end,
-   enabled = shortline or function(winid)
-      return vim.api.nvim_win_get_width(tonumber(winid) or 0) > 70
-   end,
-   hl = {
-      fg = colors.white,
-      bg = colors.lightbg,
-   },
+		right_sep = { str = statusline_style.right, hl = {
+			fg = colors.nord_blue,
+			bg = colors.lightbg,
+		} },
+	}
 
-   right_sep = { str = statusline_style.right, hl = { fg = colors.lightbg, bg = colors.lightbg2 } },
-}
+	M.file = {
+		provider = function()
+			local filename = vim.fn.expand "%:t"
+			local extension = vim.fn.expand "%:e"
+			local icon = require("nvim-web-devicons").get_icon(filename, extension)
+			if icon == nil then
+				icon = " "
+				return icon
+			end
+			return " " .. icon .. " " .. filename .. " "
+		end,
+		enabled = shortline or function(winid)
+			return vim.api.nvim_win_get_width(tonumber(winid) or 0) > 70
+		end,
+		hl = {
+			fg = colors.white,
+			bg = colors.lightbg,
+		},
 
-components.active[1][3] = {
-   provider = function()
-      local dir_name = vim.fn.fnamemodify(vim.fn.getcwd(), ":t")
-      return "  " .. dir_name .. " "
-   end,
+		right_sep = { str = statusline_style.right, hl = { fg = colors.lightbg, bg = colors.lightbg2 } },
+	}
 
-   enabled = shortline or function(winid)
-      return vim.api.nvim_win_get_width(tonumber(winid) or 0) > 80
-   end,
+	M.dir = {
+		provider = function()
+			local dir_name = vim.fn.fnamemodify(vim.fn.getcwd(), ":t")
+			return "  " .. dir_name .. " "
+		end,
 
-   hl = {
-      fg = colors.grey_fg2,
-      bg = colors.lightbg2,
-   },
-   right_sep = {
-      str = statusline_style.right,
-      hi = {
-         fg = colors.lightbg2,
-         bg = colors.statusline_bg,
-      },
-   },
-}
+		enabled = shortline or function(winid)
+			return vim.api.nvim_win_get_width(tonumber(winid) or 0) > 80
+		end,
 
-components.active[1][4] = {
-   provider = "git_diff_added",
-   hl = {
-      fg = colors.grey_fg2,
-      bg = colors.statusline_bg,
-   },
-   icon = " ",
-}
--- diffModfified
-components.active[1][5] = {
-   provider = "git_diff_changed",
-   hl = {
-      fg = colors.grey_fg2,
-      bg = colors.statusline_bg,
-   },
-   icon = "   ",
-}
--- diffRemove
-components.active[1][6] = {
-   provider = "git_diff_removed",
-   hl = {
-      fg = colors.grey_fg2,
-      bg = colors.statusline_bg,
-   },
-   icon = "  ",
-}
+		hl = {
+			fg = colors.grey_fg2,
+			bg = colors.lightbg2,
+		},
+		right_sep = {
+			str = statusline_style.right,
+			hi = {
+				fg = colors.lightbg2,
+				bg = colors.statusline_bg,
+			},
+		},
+	}
 
-components.active[1][7] = {
-   provider = "diagnostic_errors",
-   enabled = function()
-      return lsp.diagnostics_exist(lsp_severity.ERROR)
-   end,
+	M.git_added = {
+		provider = "git_diff_added",
+		hl = {
+			fg = colors.grey_fg2,
+			bg = colors.statusline_bg,
+		},
+		icon = " ",
+	}
 
-   hl = { fg = colors.red },
-   icon = "  ",
-}
+	M.git_modified = {
+		provider = "git_diff_changed",
+		hl = {
+			fg = colors.grey_fg2,
+			bg = colors.statusline_bg,
+		},
+		icon = "   ",
+	}
 
-components.active[1][8] = {
-   provider = "diagnostic_warnings",
-   enabled = function()
-      return lsp.diagnostics_exist(lsp_severity.WARN)
-   end,
-   hl = { fg = colors.yellow },
-   icon = "  ",
-}
+	M.git_removed = {
+		provider = "git_diff_removed",
+		hl = {
+			fg = colors.grey_fg2,
+			bg = colors.statusline_bg,
+		},
+		icon = "  ",
+	}
 
-components.active[1][9] = {
-   provider = "diagnostic_hints",
-   enabled = function()
-      return lsp.diagnostics_exist(lsp_severity.HINT)
-   end,
-   hl = { fg = colors.grey_fg2 },
-   icon = "  ",
-}
+	M.diagnostic_errors = {
+		provider = "diagnostic_errors",
+		enabled = function()
+			return lsp.diagnostics_exist(lsp_severity.ERROR)
+		end,
 
-components.active[1][10] = {
-   provider = "diagnostic_info",
-   enabled = function()
-      return lsp.diagnostics_exist(lsp_severity.INFO)
-   end,
-   hl = { fg = colors.green },
-   icon = "  ",
-}
+		hl = { fg = colors.red },
+		icon = "  ",
+	}
 
-components.active[2][1] = {
-   provider = function()
-      local Lsp = vim.lsp.util.get_progress_messages()[1]
+	M.diagnostic_warnings= {
+		provider = "diagnostic_warnings",
+		enabled = function()
+			return lsp.diagnostics_exist(lsp_severity.WARN)
+		end,
+		hl = { fg = colors.yellow },
+		icon = "  ",
+	}
 
-      if Lsp then
-         local msg = Lsp.message or ""
-         local percentage = Lsp.percentage or 0
-         local title = Lsp.title or ""
-         local spinners = {
-            "",
-            "",
-            "",
-         }
+	M.diagnostic_hints = {
+		provider = "diagnostic_hints",
+		enabled = function()
+			return lsp.diagnostics_exist(lsp_severity.HINT)
+		end,
+		hl = { fg = colors.grey_fg2 },
+		icon = "  ",
+	}
 
-         local success_icon = {
-            "",
-            "",
-            "",
-         }
+	M.dianostic_info ={
+		provider = "diagnostic_info",
+		enabled = function()
+			return lsp.diagnostics_exist(lsp_severity.INFO)
+		end,
+		hl = { fg = colors.green },
+		icon = "  ",
+	}
 
-         local ms = vim.loop.hrtime() / 1000000
-         local frame = math.floor(ms / 120) % #spinners
+	M.lsp_progress = {
+		provider = function()
+			local Lsp = vim.lsp.util.get_progress_messages()[1]
 
-         if percentage >= 70 then
-            return string.format(" %%<%s %s %s (%s%%%%) ", success_icon[frame + 1], title, msg, percentage)
-         end
+			if Lsp then
+				local msg = Lsp.message or ""
+				local percentage = Lsp.percentage or 0
+				local title = Lsp.title or ""
+				local spinners = {
+					"",
+					"",
+					"",
+				}
 
-         return string.format(" %%<%s %s %s (%s%%%%) ", spinners[frame + 1], title, msg, percentage)
-      end
+				local success_icon = {
+					"",
+					"",
+					"",
+				}
 
-      return ""
-   end,
-   enabled = shortline or function(winid)
-      return vim.api.nvim_win_get_width(tonumber(winid) or 0) > 80
-   end,
-   hl = { fg = colors.green },
-}
+				local ms = vim.loop.hrtime() / 1000000
+				local frame = math.floor(ms / 120) % #spinners
 
-components.active[3][1] = {
-   provider = function()
-      if next(vim.lsp.buf_get_clients()) ~= nil then
-         return "  LSP"
-      else
-         return ""
-      end
-   end,
-   enabled = shortline or function(winid)
-      return vim.api.nvim_win_get_width(tonumber(winid) or 0) > 70
-   end,
-   hl = { fg = colors.grey_fg2, bg = colors.statusline_bg },
-}
+				if percentage >= 70 then
+					return string.format(" %%<%s %s %s (%s%%%%) ", success_icon[frame + 1], title, msg, percentage)
+				end
 
-components.active[3][2] = {
-   provider = "git_branch",
-   enabled = shortline or function(winid)
-      return vim.api.nvim_win_get_width(tonumber(winid) or 0) > 70
-   end,
-   hl = {
-      fg = colors.grey_fg2,
-      bg = colors.statusline_bg,
-   },
-   icon = "  ",
-}
+				return string.format(" %%<%s %s %s (%s%%%%) ", spinners[frame + 1], title, msg, percentage)
+			end
 
-components.active[3][3] = {
-   provider = " " .. statusline_style.left,
-   hl = {
-      fg = colors.one_bg2,
-      bg = colors.statusline_bg,
-   },
-}
+			return ""
+		end,
+		enabled = shortline or function(winid)
+			return vim.api.nvim_win_get_width(tonumber(winid) or 0) > 80
+		end,
+		hl = { fg = colors.green },
+	}
 
-local mode_colors = {
-   ["n"] = { "NORMAL", colors.red },
-   ["no"] = { "N-PENDING", colors.red },
-   ["i"] = { "INSERT", colors.dark_purple },
-   ["ic"] = { "INSERT", colors.dark_purple },
-   ["t"] = { "TERMINAL", colors.green },
-   ["v"] = { "VISUAL", colors.cyan },
-   ["V"] = { "V-LINE", colors.cyan },
-   [""] = { "V-BLOCK", colors.cyan },
-   ["R"] = { "REPLACE", colors.orange },
-   ["Rv"] = { "V-REPLACE", colors.orange },
-   ["s"] = { "SELECT", colors.nord_blue },
-   ["S"] = { "S-LINE", colors.nord_blue },
-   [""] = { "S-BLOCK", colors.nord_blue },
-   ["c"] = { "COMMAND", colors.pink },
-   ["cv"] = { "COMMAND", colors.pink },
-   ["ce"] = { "COMMAND", colors.pink },
-   ["r"] = { "PROMPT", colors.teal },
-   ["rm"] = { "MORE", colors.teal },
-   ["r?"] = { "CONFIRM", colors.teal },
-   ["!"] = { "SHELL", colors.green },
-}
+	M.lsp = {
+		provider = function()
+			if next(vim.lsp.buf_get_clients()) ~= nil then
+				return "  LSP"
+			else
+				return ""
+			end
+		end,
+		enabled = shortline or function(winid)
+			return vim.api.nvim_win_get_width(tonumber(winid) or 0) > 70
+		end,
+		hl = { fg = colors.grey_fg2, bg = colors.statusline_bg },
+	}
 
-local chad_mode_hl = function()
-   return {
-      fg = mode_colors[vim.fn.mode()][2],
-      bg = colors.one_bg,
-   }
+	M.git_branch = {
+		provider = "git_branch",
+		enabled = shortline or function(winid)
+			return vim.api.nvim_win_get_width(tonumber(winid) or 0) > 70
+		end,
+		hl = {
+			fg = colors.grey_fg2,
+			bg = colors.statusline_bg,
+		},
+		icon = "  ",
+	}
+
+	M.git_right_separator = {
+		provider = " " .. statusline_style.left,
+		hl = {
+			fg = colors.one_bg2,
+			bg = colors.statusline_bg,
+		},
+	}
+
+	local mode_colors = {
+		["n"] = { "NORMAL", colors.red },
+		["no"] = { "N-PENDING", colors.red },
+		["i"] = { "INSERT", colors.dark_purple },
+		["ic"] = { "INSERT", colors.dark_purple },
+		["t"] = { "TERMINAL", colors.green },
+		["v"] = { "VISUAL", colors.cyan },
+		["V"] = { "V-LINE", colors.cyan },
+		[""] = { "V-BLOCK", colors.cyan },
+		["R"] = { "REPLACE", colors.orange },
+		["Rv"] = { "V-REPLACE", colors.orange },
+		["s"] = { "SELECT", colors.nord_blue },
+		["S"] = { "S-LINE", colors.nord_blue },
+		[""] = { "S-BLOCK", colors.nord_blue },
+		["c"] = { "COMMAND", colors.pink },
+		["cv"] = { "COMMAND", colors.pink },
+		["ce"] = { "COMMAND", colors.pink },
+		["r"] = { "PROMPT", colors.teal },
+		["rm"] = { "MORE", colors.teal },
+		["r?"] = { "CONFIRM", colors.teal },
+		["!"] = { "SHELL", colors.green },
+	}
+
+	local chad_mode_hl = function()
+		return {
+			fg = mode_colors[vim.fn.mode()][2],
+			bg = colors.one_bg,
+		}
+	end
+
+	M.mode_left_separator = {
+		provider = statusline_style.left,
+		hl = function()
+			return {
+				fg = mode_colors[vim.fn.mode()][2],
+				bg = colors.one_bg2,
+			}
+		end,
+	}
+
+	M.mode_icon = {
+		provider = statusline_style.vi_mode_icon,
+		hl = function()
+			return {
+				fg = colors.statusline_bg,
+				bg = mode_colors[vim.fn.mode()][2],
+			}
+		end,
+	}
+
+	M.mode_string = {
+		provider = function()
+			return " " .. mode_colors[vim.fn.mode()][1] .. " "
+		end,
+		hl = chad_mode_hl,
+	}
+
+	M.loc_spacer_left = {
+		provider = statusline_style.left,
+		enabled = shortline or function(winid)
+			return vim.api.nvim_win_get_width(tonumber(winid) or 0) > 90
+		end,
+		hl = {
+			fg = colors.grey,
+			bg = colors.one_bg,
+		}
+	}
+
+	M.loc_separator_left = {
+		provider = statusline_style.left,
+		enabled = shortline or function(winid)
+			return vim.api.nvim_win_get_width(tonumber(winid) or 0) > 90
+		end,
+		hl = {
+			fg = colors.green,
+			bg = colors.grey,
+		},
+	}
+
+	M.loc_position_icon = {
+		provider = statusline_style.position_icon,
+		enabled = shortline or function(winid)
+			return vim.api.nvim_win_get_width(tonumber(winid) or 0) > 90
+		end,
+		hl = {
+			fg = colors.black,
+			bg = colors.green,
+		}
+	}
+
+	M.loc_position_text = {
+		provider = function()
+			local current_line = vim.fn.line "."
+			local total_line = vim.fn.line "$"
+
+			if current_line == 1 then
+				return " Top "
+			elseif current_line == vim.fn.line "$" then
+				return " Bot "
+			end
+			local result, _ = math.modf((current_line / total_line) * 100)
+			return " " .. result .. "%% "
+		end,
+
+		enabled = shortline or function(winid)
+			return vim.api.nvim_win_get_width(tonumber(winid) or 0) > 90
+		end,
+
+		hl = {
+			fg = colors.green,
+			bg = colors.one_bg,
+		},
+	}
+	return M
 end
 
-components.active[3][4] = {
-   provider = statusline_style.left,
-   hl = function()
-      return {
-         fg = mode_colors[vim.fn.mode()][2],
-         bg = colors.one_bg2,
-      }
-   end,
-}
+local components_list = get_components()
 
-components.active[3][5] = {
-   provider = statusline_style.vi_mode_icon,
-   hl = function()
-      return {
-         fg = colors.statusline_bg,
-         bg = mode_colors[vim.fn.mode()][2],
-      }
-   end,
-}
+local left = {}
+local right = {}
+local middle = {}
 
-components.active[3][6] = {
-   provider = function()
-      return " " .. mode_colors[vim.fn.mode()][1] .. " "
-   end,
-   hl = chad_mode_hl,
-}
+table.insert(left, components_list.main_icon)
+table.insert(left, components_list.file)
+table.insert(left, components_list.dir)
 
-components.active[3][7] = {
-   provider = statusline_style.left,
-   enabled = shortline or function(winid)
-      return vim.api.nvim_win_get_width(tonumber(winid) or 0) > 90
-   end,
-   hl = {
-      fg = colors.grey,
-      bg = colors.one_bg,
-   },
-}
+table.insert(left, components_list.git_added)
+table.insert(left, components_list.git_modified)
+table.insert(left, components_list.git_removed)
 
-components.active[3][8] = {
-   provider = statusline_style.left,
-   enabled = shortline or function(winid)
-      return vim.api.nvim_win_get_width(tonumber(winid) or 0) > 90
-   end,
-   hl = {
-      fg = colors.green,
-      bg = colors.grey,
-   },
-}
+table.insert(left, components_list.diagnostic_errors)
+table.insert(left, components_list.diagnostic_warnings)
+table.insert(left, components_list.diagnostic_hints)
+table.insert(left, components_list.diagnostic_info)
 
-components.active[3][9] = {
-   provider = statusline_style.position_icon,
-   enabled = shortline or function(winid)
-      return vim.api.nvim_win_get_width(tonumber(winid) or 0) > 90
-   end,
-   hl = {
-      fg = colors.black,
-      bg = colors.green,
-   },
-}
+table.insert(middle, components_list.lsp_progress)
 
-components.active[3][10] = {
-   provider = function()
-      local current_line = vim.fn.line "."
-      local total_line = vim.fn.line "$"
+table.insert(right, components_list.lsp)
+table.insert(right, components_list.git_branch)
+table.insert(right, components_list.git_right_separator)
 
-      if current_line == 1 then
-         return " Top "
-      elseif current_line == vim.fn.line "$" then
-         return " Bot "
-      end
-      local result, _ = math.modf((current_line / total_line) * 100)
-      return " " .. result .. "%% "
-   end,
+table.insert(right, components_list.mode_left_separator)
+table.insert(right, components_list.mode_mode_icon)
+table.insert(right, components_list.mode_mode_string)
 
-   enabled = shortline or function(winid)
-      return vim.api.nvim_win_get_width(tonumber(winid) or 0) > 90
-   end,
+table.insert(right, components_list.loc_spacer_left)
+table.insert(right, components_list.loc_separator_left)
+table.insert(right, components_list.loc_position_icon)
+table.insert(right, components_list.loc_position_text)
 
-   hl = {
-      fg = colors.green,
-      bg = colors.one_bg,
-   },
-}
+components.active[1] = left
+components.active[2] = middle
+components.active[3] = right
 
 require("feline").setup {
-   theme = {
-      bg = colors.statusline_bg,
-      fg = colors.fg,
-   },
-   components = components,
+	theme = {
+		bg = colors.statusline_bg,
+		fg = colors.fg,
+	},
+	components = components,
 }