diff --git a/lua/plugins/configs/statusline.lua b/lua/plugins/configs/statusline.lua index 500403b..6bce988 100644 --- a/lua/plugins/configs/statusline.lua +++ b/lua/plugins/configs/statusline.lua @@ -1,46 +1,46 @@ -local colors = require("colors").get() + local colors = require("colors").get() 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,370 +54,366 @@ local shortline = config.shortline == false and true -- Initialize the components table local components = { - active = {}, - inactive = {}, + active = {}, } -table.insert(components.active, {}) -table.insert(components.active, {}) -table.insert(components.active, {}) +local main_icon = { + 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, - }, +local file_name = { + 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, - }, +local dir_name = { + 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, +local diff = { + add = { + provider = "git_diff_added", + 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, - }, - }, - } + change = { + provider = "git_diff_changed", + hl = { + fg = colors.grey_fg2, + bg = colors.statusline_bg, + }, + icon = "  ", + }, - M.git_added = { - provider = "git_diff_added", - hl = { - fg = colors.grey_fg2, - bg = colors.statusline_bg, - }, - icon = " ", - } + remove = { + provider = "git_diff_removed", + hl = { + fg = colors.grey_fg2, + bg = colors.statusline_bg, + }, + icon = "  ", + }, +} - M.git_modified = { - provider = "git_diff_changed", - hl = { - fg = colors.grey_fg2, - bg = colors.statusline_bg, - }, - icon = "  ", - } +local 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_removed = { - provider = "git_diff_removed", - hl = { - fg = colors.grey_fg2, - bg = colors.statusline_bg, - }, - icon = "  ", - } +local diagnostic = { + errors = { + provider = "diagnostic_errors", + enabled = function() + return lsp.diagnostics_exist(lsp_severity.ERROR) + end, - M.diagnostic_errors = { - provider = "diagnostic_errors", - enabled = function() - return lsp.diagnostics_exist(lsp_severity.ERROR) - end, + hl = { fg = colors.red }, + icon = "  ", + }, - hl = { fg = colors.red }, - icon = "  ", - } + warning = { + provider = "diagnostic_warnings", + enabled = function() + return lsp.diagnostics_exist(lsp_severity.WARN) + end, + hl = { fg = colors.yellow }, + icon = "  ", + }, - M.diagnostic_warnings= { - provider = "diagnostic_warnings", - enabled = function() - return lsp.diagnostics_exist(lsp_severity.WARN) - end, - hl = { fg = colors.yellow }, - icon = "  ", - } + hint = { + provider = "diagnostic_hints", + enabled = function() + return lsp.diagnostics_exist(lsp_severity.HINT) + end, + hl = { fg = colors.grey_fg2 }, + icon = "  ", + }, - M.diagnostic_hints = { - provider = "diagnostic_hints", - enabled = function() - return lsp.diagnostics_exist(lsp_severity.HINT) - end, - hl = { fg = colors.grey_fg2 }, - icon = "  ", - } + info = { + provider = "diagnostic_info", + enabled = function() + return lsp.diagnostics_exist(lsp_severity.INFO) + end, + hl = { fg = colors.green }, + icon = "  ", + }, +} - M.dianostic_info ={ - provider = "diagnostic_info", - enabled = function() - return lsp.diagnostics_exist(lsp_severity.INFO) - end, - hl = { fg = colors.green }, - icon = "  ", - } +local lsp_progress = { + provider = function() + local Lsp = vim.lsp.util.get_progress_messages()[1] - M.lsp_progress = { - provider = function() - local Lsp = vim.lsp.util.get_progress_messages()[1] + if Lsp then + local msg = Lsp.message or "" + local percentage = Lsp.percentage or 0 + local title = Lsp.title or "" + local spinners = { + "", + "", + "", + } - if Lsp then - local msg = Lsp.message or "" - local percentage = Lsp.percentage or 0 - local title = Lsp.title or "" - local spinners = { - "", - "", - "", - } + local success_icon = { + "", + "", + "", + } - local success_icon = { - "", - "", - "", - } + local ms = vim.loop.hrtime() / 1000000 + local frame = math.floor(ms / 120) % #spinners - local ms = vim.loop.hrtime() / 1000000 - local frame = math.floor(ms / 120) % #spinners + if percentage >= 70 then + return string.format(" %%<%s %s %s (%s%%%%) ", success_icon[frame + 1], title, msg, percentage) + end - if percentage >= 70 then - return string.format(" %%<%s %s %s (%s%%%%) ", success_icon[frame + 1], title, msg, percentage) - end + return string.format(" %%<%s %s %s (%s%%%%) ", spinners[frame + 1], title, msg, percentage) + end - return string.format(" %%<%s %s %s (%s%%%%) ", spinners[frame + 1], title, msg, percentage) - end + return "" + end, + enabled = shortline or function(winid) + return vim.api.nvim_win_get_width(tonumber(winid) or 0) > 80 + end, + hl = { fg = colors.green }, +} - 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 lsp_icon = { + 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 }, +} - 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 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.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 +local chad_mode_hl = function() + return { + fg = mode_colors[vim.fn.mode()][2], + bg = colors.one_bg, + } end -local components_list = get_components() +local empty_space = { + provider = " " .. statusline_style.left, + hl = { + fg = colors.one_bg2, + bg = colors.statusline_bg, + }, +} +-- this matches the vi mode color +local empty_spaceColored = { + provider = statusline_style.left, + hl = function() + return { + fg = mode_colors[vim.fn.mode()][2], + bg = colors.one_bg2, + } + end, +} + +local mode_icon = { + provider = statusline_style.vi_mode_icon, + hl = function() + return { + fg = colors.statusline_bg, + bg = mode_colors[vim.fn.mode()][2], + } + end, +} + +local empty_space2 = { + provider = function() + return " " .. mode_colors[vim.fn.mode()][1] .. " " + end, + hl = chad_mode_hl, +} + +local separator_right = { + 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, + }, +} + +local separator_right2 = { + 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, + }, +} + +local 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, + }, +} + +local current_line = { + 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, + }, +} + +local function add_table(a, b) + table.insert(a, b) +end + +-- components are divided in 3 sections local left = {} -local right = {} local middle = {} +local right = {} -table.insert(left, components_list.main_icon) -table.insert(left, components_list.file) -table.insert(left, components_list.dir) +-- left +add_table(left, main_icon) +add_table(left, file_name) +add_table(left, dir_name) +add_table(left, diff.add) +add_table(left, diff.change) +add_table(left, diff.remove) +add_table(left, diagnostic.error) +add_table(left, diagnostic.warning) +add_table(left, diagnostic.hint) +add_table(left, diagnostic.info) -table.insert(left, components_list.git_added) -table.insert(left, components_list.git_modified) -table.insert(left, components_list.git_removed) +add_table(middle, lsp_progress) -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) - -table.insert(middle, components_list.lsp_progress) - -table.insert(right, components_list.lsp) -table.insert(right, components_list.git_branch) -table.insert(right, components_list.git_right_separator) - -table.insert(right, components_list.mode_left_separator) -table.insert(right, components_list.mode_mode_icon) -table.insert(right, components_list.mode_mode_string) - -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) +-- right +add_table(right, lsp_icon) +add_table(right, git_branch) +add_table(right, empty_space) +add_table(right, empty_spaceColored) +add_table(right, mode_icon) +add_table(right, empty_space2) +add_table(right, separator_right) +add_table(right, separator_right2) +add_table(right, position_icon) +add_table(right, current_line) 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, }