From 97811dd201f2f88ff453303d8baa6739616cc9fb Mon Sep 17 00:00:00 2001 From: Elvis Claros Castro Date: Wed, 3 Sep 2025 21:11:57 -0300 Subject: =?UTF-8?q?feat(statusline):=20migraci=C3=B3n=20de=20implementaci?= =?UTF-8?q?=C3=B3n=20nativa=20a=20lualine.nvim?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se reemplazó la barra de estado personalizada nativa por el plugin lualine.nvim para mejorar la flexibilidad, el mantenimiento y la estética. Se eliminó el módulo native-statusline y su configuración en config. Se agregó una nueva configuración de lualine aprovechando el esquema de colores nativo y secciones personalizadas. Este cambio permite funciones más avanzadas en la barra de estado, mejor integración con iconos y diagnósticos, y una personalización futura más sencilla. --- lua/config/init.lua | 3 - lua/config/native-statusline.lua | 308 --------------------------------------- lua/plugins/lualine.lua | 233 +++++++++++++++++++++++++++++ 3 files changed, 233 insertions(+), 311 deletions(-) delete mode 100644 lua/config/native-statusline.lua create mode 100644 lua/plugins/lualine.lua (limited to 'lua') diff --git a/lua/config/init.lua b/lua/config/init.lua index 534555f..7bd1993 100644 --- a/lua/config/init.lua +++ b/lua/config/init.lua @@ -7,9 +7,6 @@ require "config.options" local colorscheme = require("config.native-colorscheme") colorscheme.setup() -local statusline = require("config.native-statusline") -statusline.setup() - -- Additional UI Enhancements vim.opt.guicursor = "n-v-c:block,i-ci-ve:ver25,r-cr:hor20,o:hor50" vim.opt.cursorline = true diff --git a/lua/config/native-statusline.lua b/lua/config/native-statusline.lua deleted file mode 100644 index 61ac97a..0000000 --- a/lua/config/native-statusline.lua +++ /dev/null @@ -1,308 +0,0 @@ --- ===================================================== --- Native Statusline Implementation --- Replacement for lualine.nvim --- ===================================================== - -local M = {} - --- Import colors from our native colorscheme -local function get_colors() - local ok, colorscheme = pcall(require, "config.native-colorscheme") - if ok then - return colorscheme.colors - end - -- Fallback colors - return { - base03 = "#16161e", - fg = "#c0caf5", - blue100 = "#9bb3f7", - green100 = "#b3d882", - yellow100 = "#e7c664", - orange100 = "#ffad7a", - red100 = "#ff7a93", - cyan100 = "#7dd3c0", - magenta100 = "#d2a8ff", - base4 = "#c0caf5", - green300 = "#9ece6a", - yellow300 = "#e0af68", - red300 = "#f7768e", - blue300 = "#7aa2f7", - cyan300 = "#73daca", - orange300 = "#ff9e64", - } -end - -local colors = get_colors() - --- Helper function to create highlight groups -local function create_highlight(name, fg, bg, style) - local hl = { fg = fg, bg = bg } - if style then - if style:find "bold" then - hl.bold = true - end - if style:find "italic" then - hl.italic = true - end - end - vim.api.nvim_set_hl(0, name, hl) - return "%#" .. name .. "#" -end - --- Define statusline highlight groups -local function setup_highlights() - create_highlight("StatuslineModeNormal", colors.blue100, colors.base03, "bold") - create_highlight("StatuslineModeInsert", colors.green100, colors.base03, "bold") - create_highlight("StatuslineModeVisual", colors.magenta100, colors.base03, "bold") - create_highlight("StatuslineModeReplace", colors.red100, colors.base03, "bold") - create_highlight("StatuslineModeCommand", colors.yellow100, colors.base03, "bold") - create_highlight("StatuslineModeTerminal", colors.orange100, colors.base03, "bold") - - create_highlight("StatuslineBranch", colors.orange100, colors.base03, "bold") - create_highlight("StatuslineFilename", colors.yellow100, colors.base03, "bold") - create_highlight("StatuslineLSP", colors.base4, colors.base03, "bold") - create_highlight("StatuslineFiletype", colors.magenta100, colors.base03, "bold") - create_highlight("StatuslineProgress", colors.cyan100, colors.base03, "bold") - - create_highlight("StatuslineGitAdd", colors.green300, colors.base03, "bold") - create_highlight("StatuslineGitChange", colors.yellow300, colors.base03, "bold") - create_highlight("StatuslineGitDelete", colors.red300, colors.base03, "bold") - - create_highlight("StatuslineDiagError", colors.red300, colors.base03, "bold") - create_highlight("StatuslineDiagWarn", colors.yellow300, colors.base03, "bold") - create_highlight("StatuslineDiagInfo", colors.blue300, colors.base03, "bold") - create_highlight("StatuslineDiagHint", colors.cyan300, colors.base03, "bold") - - create_highlight("StatuslineSeparator", colors.base03, colors.base03, "") -end - --- Get current mode -local function get_mode() - local mode_map = { - n = { "NORMAL", "StatuslineModeNormal", " " }, - i = { "INSERT", "StatuslineModeInsert", " " }, - v = { "VISUAL", "StatuslineModeVisual", "󰈈 " }, - V = { "V-LINE", "StatuslineModeVisual", "󰕞 " }, - ["\22"] = { "V-BLOCK", "StatuslineModeVisual", "󰩭 " }, -- Ctrl+v visual block mode - c = { "COMMAND", "StatuslineModeCommand", " " }, - R = { "REPLACE", "StatuslineModeReplace", "󰛔 " }, - t = { "TERMINAL", "StatuslineModeTerminal", " " }, - } - - local current_mode = vim.fn.mode() - local mode_info = mode_map[current_mode] or { "UNKNOWN", "StatuslineModeNormal", " " } - - return "%#" .. mode_info[2] .. "#" .. mode_info[3] .. mode_info[1] .. " " -end - --- Get git branch -local function get_git_branch() - local handle = io.popen "git branch --show-current 2>/dev/null" - if not handle then - return "" - end - - local branch = handle:read "*l" - handle:close() - - if not branch or branch == "" then - return "" - end - return "%#StatuslineBranch# " .. "  " .. branch .. " " -end - --- Get git diff stats -local function get_git_diff() - -- Check if we're in a git repository - local handle = io.popen "git rev-parse --is-inside-work-tree 2>/dev/null" - if not handle then - return "" - end - - local is_git = handle:read "*l" - handle:close() - - if is_git ~= "true" then - return "" - end - - -- Get staged changes - local staged_handle = io.popen "git diff --cached --numstat 2>/dev/null | wc -l" - local added = staged_handle and staged_handle:read "*l" or "0" - if staged_handle then - staged_handle:close() - end - - -- Get unstaged changes - local unstaged_handle = io.popen "git diff --numstat 2>/dev/null | wc -l" - local modified = unstaged_handle and unstaged_handle:read "*l" or "0" - if unstaged_handle then - unstaged_handle:close() - end - - local result = "" - if tonumber(added) and tonumber(added) > 0 then - result = result .. "%#StatuslineGitAdd#  +" .. added .. " " - end - if tonumber(modified) and tonumber(modified) > 0 then - result = result .. "%#StatuslineGitChange#  ~" .. modified .. " " - end - - return result -end - --- Get filename with path -local function get_filename() - local filename = vim.fn.expand "%:t" - if filename == "" then - filename = "[No Name]" - end - return "%#StatuslineFilename# " .. filename .. " " -end - --- Get LSP clients -local function get_lsp_clients() - local clients = vim.lsp.get_clients { bufnr = 0 } - if #clients == 0 then - return "%#StatuslineLSP#No LSP " - end - - -- Map common LSP names to icons (nerdfonts / devicons style). Add or adjust as you like. - local lsp_icons = { - lua_ls = "", - sumneko_lua = "", - pyright = "", - pylsp = "", - tsserver = "", - denols = "", - rust_analyzer = "", - gopls = "", - clangd = "", - html = "󰜫", - cssls = "", - bashls = "", - jsonls = "ﬥ", - tailwindcss = "", - angularls = "", - emmet_ls = "", - ["null-ls"] = "ﳠ", - copilot = "", - } - - local seen = {} - local client_names = {} - for _, client in ipairs(clients) do - local name = client.name or "unknown" - if not seen[name] then - seen[name] = true - local icon = lsp_icons[name] or "" - table.insert(client_names, icon .. " " .. name) - end - end - - return "%#StatuslineLSP#" .. "LSP: " .. table.concat(client_names, ", ") .. " " -end - --- Get diagnostics -local function get_diagnostics() - local diagnostics = vim.diagnostic.get(0) - local counts = { error = 0, warn = 0, info = 0, hint = 0 } - - for _, diagnostic in ipairs(diagnostics) do - if diagnostic.severity == vim.diagnostic.severity.ERROR then - counts.error = counts.error + 1 - elseif diagnostic.severity == vim.diagnostic.severity.WARN then - counts.warn = counts.warn + 1 - elseif diagnostic.severity == vim.diagnostic.severity.INFO then - counts.info = counts.info + 1 - elseif diagnostic.severity == vim.diagnostic.severity.HINT then - counts.hint = counts.hint + 1 - end - end - - local result = "" - - -- Add icons for each diagnostic type (uses nerdfonts/devicons where available) - if counts.error > 0 then - result = result .. "%#StatuslineDiagError#  " .. counts.error .. " " - end - if counts.warn > 0 then - result = result .. "%#StatuslineDiagWarn#  " .. counts.warn .. " " - end - if counts.info > 0 then - result = result .. "%#StatuslineDiagInfo#  " .. counts.info .. " " - end - if counts.hint > 0 then - result = result .. "%#StatuslineDiagHint# 󰠠 " .. counts.hint .. " " - end - - return result -end - --- Get filetype -local function get_filetype() - local filetype = vim.bo.filetype - if filetype == "" then - return "" - end - return "%#StatuslineFiletype#" .. filetype .. " " -end - --- Get progress (line/total) -local function get_progress() - local current = vim.fn.line "." - local total = vim.fn.line "$" - local percentage = math.floor((current / total) * 100) - return "%#StatuslineProgress#" .. percentage .. "%% " -end - --- Get separator -local function separator() - return "%#StatuslineSeparator# " -end - --- Build the statusline -function M.build_statusline() - local left = get_mode() - .. separator() - .. get_git_branch() - .. separator() - .. get_git_diff() - .. separator() - .. get_filetype() - .. get_filename() - - local right = get_diagnostics() .. separator() .. get_lsp_clients() .. separator() .. get_progress() - - return left .. "%=" .. right -end - --- Setup function -function M.setup() - setup_highlights() - - -- Set up autocommands to refresh statusline - vim.api.nvim_create_augroup("NativeStatusline", { clear = true }) - - -- Update statusline on various events - vim.api.nvim_create_autocmd({ - "VimEnter", - "WinEnter", - "BufEnter", - "ModeChanged", - "DiagnosticChanged", - }, { - group = "NativeStatusline", - callback = function() - vim.opt.statusline = M.build_statusline() - end, - }) - - -- Set initial statusline - vim.opt.statusline = M.build_statusline() - - -- Always show statusline - vim.opt.laststatus = 2 -end - -return M diff --git a/lua/plugins/lualine.lua b/lua/plugins/lualine.lua new file mode 100644 index 0000000..aa74930 --- /dev/null +++ b/lua/plugins/lualine.lua @@ -0,0 +1,233 @@ +return { + "nvim-lualine/lualine.nvim", + dependencies = { "nvim-tree/nvim-web-devicons" }, + config = function() + local native_colorscheme = require "config.native-colorscheme" + local colors = native_colorscheme.colors + local config = { lualine_bold = true } -- Default config since we're not using solarized-osaka plugin + + local personal_colors = { + normal = { + a = { bg = colors.base03, fg = colors.blue100 }, + b = { bg = colors.fg, fg = colors.bg }, + c = { bg = colors.bg_statusline, fg = colors.fg }, + }, + insert = { + a = { bg = colors.base03, fg = colors.green100 }, + }, + + command = { + a = { bg = colors.base03, fg = colors.yellow100 }, + }, + + visual = { + a = { bg = colors.base03, fg = colors.magenta100 }, + }, + + replace = { + a = { bg = colors.base03, fg = colors.red100 }, + }, + + terminal = { + a = { bg = colors.base03, fg = colors.orange100 }, + }, + + inactive = { + a = { bg = colors.bg_statusline, fg = colors.blue }, + b = { bg = colors.bg_statusline, fg = colors.fg, gui = "bold" }, + c = { bg = colors.bg_statusline, fg = colors.fg }, + }, + } + + for _, mode in pairs(personal_colors) do + if config.lualine_bold then + mode.a.gui = "bold" + end + end + + -- local empty = require('lualine.component'):extend() + + -- local function jarak() + -- return ' ' + -- end + + local empty = require("lualine.component"):extend() + function empty:draw(default_highlight) + self.status = "" + self.applied_separator = "" + self:apply_highlights(default_highlight) + self:apply_section_separators() + return self.status + end + + local function process_sections(sections) + for name, section in pairs(sections) do + local left = name:sub(9, 10) < "x" + for pos = 1, name ~= "lualine_z" and #section or #section - 1 do + table.insert(section, pos * 2, { empty, color = { fg = colors.base03, bg = colors.base03 } }) + end + for id, comp in ipairs(section) do + if type(comp) ~= "table" then + comp = { comp } + section[id] = comp + end + -- comp.separator = left and { right = '' } or { left = '' } + comp.separator = left and { right = " " } or { left = " " } + -- comp.separator = {left = '' } and { right = '' } + end + end + return sections + end + + local lazy_status = require "lazy.status" + + require("lualine").setup { + options = { + theme = personal_colors, + -- icons_enabled = true, + -- component_separators = { left = '>', right = '┇' }, + -- section_separators = {left = '', right = '' }, + }, + sections = process_sections { + lualine_a = { + { + "mode", + icons_enabled = true, + icon = { + " ", + color = { fg = colors.base4, bg = colors.base03, gui = "bold" }, + }, + -- color = { fg = colors.base0, bg = colors.green300, gui = 'bold' }, + -- separator = { left = '', right = '' }, + -- left_padding = 2, right_padding = 0, + }, + }, + -- lualine_b = { 'filename', 'branch' }, + lualine_b = { + { + "branch", + -- separator = { left = '', right = '' }, + -- left_padding = 0, right_padding = 2, + icon = { + "", + -- align = 'left', + color = { fg = colors.orange100, bg = colors.base03, gui = "bold" }, + -- -- separator = {left = '', right = ''} + }, + -- left_padding = 0, + color = { fg = colors.orange100, bg = colors.base03, gui = "bold" }, + }, + { + "diff", + -- separator = { right = '',left = ''}, + colored = true, + symbols = { added = " ", modified = " ", removed = " " }, + diff_color = { + added = { fg = colors.green300, bg = colors.base03, gui = "bold" }, + modified = { fg = colors.yellow300, bg = colors.base03, gui = "bold" }, + removed = { fg = colors.red300, bg = colors.base03, gui = "bold" }, + }, + }, + }, + lualine_c = { + { + "filename", + on_click = function() + require("telescope.builtin").find_files() + -- print('file name clicked') + end, + icon = " ", + color = { fg = colors.yellow100, bg = colors.base03, gui = "bold" }, + path = 4, + file_status = false, + -- separator = { right = '┇', left = '┇'}, + }, + }, + lualine_x = { + { + "diagnostics", + on_click = function() + require("telescope.builtin").diagnostics() + end, + -- separator = { left = '' }, + sources = { "nvim_diagnostic" }, + sections = { "error", "warn", "info", "hint" }, + + diagnostics_color = { + error = { fg = colors.red300, bg = colors.base03, gui = "bold" }, -- Changes diagnostics' error color. + added = { fg = colors.green300, bg = colors.base03, gui = "bold" }, + warn = { fg = colors.yellow300, bg = colors.base03, gui = "bold" }, -- Changes diagnostics' warn color. + info = { fg = colors.blue300, bg = colors.base03, gui = "bold" }, -- Changes diagnostics' info color. + hint = { fg = colors.cyan300, bg = colors.base03, gui = "bold" }, -- Changes diagnostics' hint color. + }, + symbols = { error = " ", warn = " ", hint = "󰠠 ", info = " " }, + colored = true, -- Displays diagnostics status in color if set to true. + update_in_insert = true, -- Update diagnostics in insert mode. default = false + always_visible = false, -- Show diagnostics even if there are none. + }, + { + lazy_status.updates, + cond = lazy_status.has_updates, + color = { fg = colors.orange300 }, + }, + { + -- code from https://github.com/nvim-lualine/lualine.nvim/blob/566b7036f717f3d676362742630518a47f132fff/examples/evil_lualine.lua + -- Lsp server name . + function() + local msg = "No LSP" + local buf_ft = vim.api.nvim_get_option_value("filetype", { buf = 0 }) + local clients = vim.lsp.get_clients() + if next(clients) == nil then + return msg + end + for _, client in ipairs(clients) do + local filetypes = client.config.filetypes + if filetypes and vim.fn.index(filetypes, buf_ft) ~= -1 then + return client.name + end + end + return msg + end, + -- icon = ' LSP:', + -- icon = {' ', color = {bg = colors.base03, fg = colors.red100}}, + -- separator = { left = '', right = ''}, + -- separator = { left = ' ', right = ' '}, + color = { fg = colors.base4, gui = "bold", bg = colors.base03 }, + }, + + { + "filetype", + color = { bg = colors.base03, fg = colors.magenta100, gui = "bold" }, + -- separator = { left = '', right = ' ' }, + }, + }, + lualine_y = { + { + "progress", + left_padding = 0, + color = { bg = colors.base03, fg = colors.cyan100, gui = "bold" }, + }, + }, + lualine_z = { + { + -- 'location', + -- function() + -- return "Ln:%l Col:%c" + -- end + -- separator = { right = '' }, left_padding = 2 }, + }, + }, + }, + inactive_sections = { + lualine_a = {}, + lualine_b = {}, + lualine_c = { "filename" }, + lualine_x = { "location" }, + lualine_y = {}, + lualine_z = {}, + }, + tabline = {}, + extensions = {}, + } + end, +} -- cgit v1.2.3