dotfiles

custom linux config files managed with gnu stow

dotfiles

neovim/.config/nvim/lua/plugins/lualine.lua


return {
	"nvim-lualine/lualine.nvim",
	event = "VeryLazy",
	dependencies = { "nvim-tree/nvim-web-devicons" },
	init = function()
		-- disable until lualine loads
		vim.opt.laststatus = 0
	end,
	opts = function()
		-- evangelion colors
		local colors = {
			bg = "#201430",
			black = "#000000",
			magenta = "#483160",
			green = "#87FF5F",
			lost = "#666666",
			unit01 = "#67478a",
			selee = "#875FAF",
			mint = "#9cda7c",
			hazard = "#D99145",
			purple = "#AB92FC",
			lcl = "#5b2b41",
			nerv = "#bf2d2d",
			rei = "#e1d6f8",
		}

		local conditions = {
			buffer_not_empty = function()
				return vim.fn.empty(vim.fn.expand("%:t")) ~= 1
			end,
			hide_in_width_first = function()
				return vim.fn.winwidth(0) > 80
			end,
			hide_in_width = function()
				return vim.fn.winwidth(0) > 70
			end,
			check_git_workspace = function()
				local filepath = vim.fn.expand("%:p:h")
				local gitdir = vim.fn.finddir(".git", filepath .. ";")
				return gitdir and #gitdir > 0 and #gitdir < #filepath
			end,
		}
		-- auto change color according to neovims mode
		local mode_color = {
			n = { bg = colors.magenta, fg = colors.green },
			i = { bg = colors.purple, fg = colors.black },
			v = { bg = colors.green, fg = colors.black },
			[""] = { bg = colors.green, fg = colors.black },
			V = { bg = colors.green, fg = colors.black },
			c = { bg = colors.hazard, fg = colors.black },
			no = { bg = colors.green, fg = colors.black },
			s = { bg = colors.hazard, fg = colors.black },
			S = { bg = colors.hazard, fg = colors.black },
			[""] = { bg = colors.hazard, fg = colors.black },
			ic = { bg = colors.hazard, fg = colors.black },
			R = { bg = colors.hazard, fg = colors.black },
			Rv = { bg = colors.hazard, fg = colors.black },
			cv = { bg = colors.hazard, fg = colors.black },
			ce = { bg = colors.hazard, fg = colors.black },
			r = { bg = colors.blood, fg = colors.black },
			rm = { bg = colors.blood, fg = colors.black },
			["r?"] = { bg = colors.lcl, fg = colors.black },
			["!"] = { bg = colors.lcl, fg = colors.black },
			t = { bg = colors.green, fg = colors.black },
		}
		-- config
		local config = {
			options = {
				-- remove default sections and component separators
				component_separators = "",
				section_separators = "",
				theme = {
					-- setting defaults to statusline
					normal = { c = { fg = colors.fg, bg = colors.bg } },
					inactive = { c = { fg = colors.fg, bg = colors.bg } },
				},
			},
			sections = {
				-- clear defaults
				lualine_a = {},
				lualine_b = {},
				lualine_y = {},
				lualine_z = {},
				-- clear for later use
				lualine_c = {},
				lualine_x = {},
			},
			inactive_sections = {
				-- clear defaults
				lualine_a = {},
				lualine_b = {},
				lualine_y = {},
				lualine_z = {},
				-- clear for later use
				lualine_c = {},
				lualine_x = {},
			},
		}

		-- insert active component in lualine_c at left section
		local function active_left(component)
			table.insert(config.sections.lualine_c, component)
		end

		-- insert inactive component in lualine_c at left section
		local function inactive_left(component)
			table.insert(config.inactive_sections.lualine_c, component)
		end

		-- insert active component in lualine_x at right section
		local function active_right(component)
			table.insert(config.sections.lualine_x, component)
		end

		-- insert inactive component in lualine_x at right section
		local function inactive_right(component)
			table.insert(config.inactive_sections.lualine_x, component)
		end

		-- dump object contents
		local function dump(o)
			if type(o) == "table" then
				local s = ""
				for k, v in pairs(o) do
					if type(k) ~= "number" then
						k = '"' .. k .. '"'
					end
					s = s .. dump(v) .. ","
				end
				return s
			else
				return tostring(o)
			end
		end

		-- active left section
		active_left({
			function()
				local icon
				local ok, devicons = pcall(require, "nvim-web-devicons")
				if ok then
					icon = devicons.get_icon(vim.fn.expand("%:t"))
					if icon == nil then
						icon = devicons.get_icon_by_filetype(vim.bo.filetype)
					end
				else
					if vim.fn.exists("*WebDevIconsGetFileTypeSymbol") > 0 then
						icon = vim.fn.WebDevIconsGetFileTypeSymbol()
					end
				end
				if icon == nil then
					icon = ""
				end
				return icon:gsub("%s+", "")
			end,
			color = function()
				return { bg = mode_color[vim.fn.mode()].bg, fg = mode_color[vim.fn.mode()].fg }
			end,
			padding = { left = 1, right = 1 },
			separator = { right = "▓▒░" },
		})
		active_left({
			"filename",
			cond = conditions.buffer_not_empty,
			color = function()
				return { bg = mode_color[vim.fn.mode()].bg, fg = mode_color[vim.fn.mode()].fg }
			end,
			padding = { left = 1, right = 1 },
			separator = { right = "▓▒░" },
			symbols = {
				modified = "󰶻 ",
				readonly = " ",
				unnamed = " ",
				newfile = " ",
			},
		})
		active_left({
			"branch",
			icon = "",
			color = { bg = colors.selee, fg = colors.rei },
			padding = { left = 0, right = 1 },
			separator = { right = "▓▒░", left = "░▒▓" },
		})

		-- inactive left section
		inactive_left({
			function()
				return ""
			end,
			cond = conditions.buffer_not_empty,
			color = { bg = colors.black, fg = colors.lost },
			padding = { left = 1, right = 1 },
		})
		inactive_left({
			"filename",
			cond = conditions.buffer_not_empty,
			color = { bg = colors.black, fg = colors.lost },
			padding = { left = 1, right = 1 },
			separator = { right = "▓▒░" },
			symbols = {
				modified = "",
				readonly = "",
				unnamed = "",
				newfile = "",
			},
		})

		-- active right section
		active_right({
			function()
				if vim.lsp.get_clients then
					local clients = vim.lsp.get_clients({ bufnr = 0 })
					local clients_list = {}
					for _, client in pairs(clients) do
						if not clients_list[client.name] then
							table.insert(clients_list, client.name)
						end
					end
					local lsp_lbl = dump(clients_list):gsub("(.*),", "%1")
					return lsp_lbl:gsub(",", ", ")
				end
			end,
			icon = " ",
			color = { bg = colors.mint, fg = colors.black },
			padding = { left = 1, right = 1 },
			cond = conditions.hide_in_width_first,
			separator = { right = "▓▒░", left = "░▒▓" },
		})

		active_right({
			"diagnostics",
			sources = { "nvim_diagnostic" },
			symbols = { error = " ", warn = " ", info = " " },
			diagnostics_color = {
				error = { fg = colors.black },
				info = { fg = colors.black },
				warn = { fg = colors.black },
			},
			colounit01 = false,
			color = { bg = colors.hazard, fg = colors.black },
			padding = { left = 1, right = 1 },
			separator = { right = "▓▒░", left = "░▒▓" },
		})
		active_right({
			"searchcount",
			color = { bg = colors.purple, fg = colors.rei },
			padding = { left = 1, right = 1 },
			separator = { right = "▓▒░", left = "░▒▓" },
		})
		active_right({
			"location",
			color = { bg = colors.unit01, fg = colors.rei },
			padding = { left = 1, right = 0 },
			separator = { left = "░▒▓" },
		})
		active_right({
			function()
				local cur = vim.fn.line(".")
				local total = vim.fn.line("$")
				return string.format("%2d%%%%", math.floor(cur / total * 100))
			end,
			color = { bg = colors.unit01, fg = colors.rei },
			padding = { left = 1, right = 1 },
			cond = conditions.hide_in_width,
			separator = { right = "▓▒░" },
		})
		active_right({
			"o:encoding",
			fmt = string.upper,
			cond = conditions.hide_in_width,
			padding = { left = 1, right = 1 },
			color = { bg = colors.selee, fg = colors.black },
		})
		active_right({
			"fileformat",
			fmt = string.lower,
			icons_enabled = false,
			cond = conditions.hide_in_width,
			color = { bg = colors.selee, fg = colors.black },
			separator = { right = "▓▒░" },
			padding = { left = 0, right = 1 },
		})

		-- inactive right section
		inactive_right({
			"location",
			color = { bg = colors.black, fg = colors.lost },
			padding = { left = 1, right = 0 },
			separator = { left = "░▒▓" },
		})
		inactive_right({
			"progress",
			color = { bg = colors.black, fg = colors.lost },
			cond = conditions.hide_in_width,
			padding = { left = 1, right = 1 },
			separator = { right = "▓▒░" },
		})
		inactive_right({
			"fileformat",
			fmt = string.lower,
			icons_enabled = false,
			cond = conditions.hide_in_width,
			color = { bg = colors.black, fg = colors.lost },
			separator = { right = "▓▒░" },
			padding = { left = 0, right = 1 },
		})
		--
		return config
	end,
}

Download

raw zip tar