From cc0c154184a778c60a0a6741f8e01483146569dc Mon Sep 17 00:00:00 2001 From: Samir Benmendil Date: Mon, 10 Feb 2025 21:58:56 +0000 Subject: [PATCH] lazyvim: absorb ui plugins (inc extra/navic) --- nvim/lua/plugins/ui.lua | 234 +++++++++++++++++++++++++++++++++++----- 1 file changed, 206 insertions(+), 28 deletions(-) diff --git a/nvim/lua/plugins/ui.lua b/nvim/lua/plugins/ui.lua index f34b5a3..fc905d7 100644 --- a/nvim/lua/plugins/ui.lua +++ b/nvim/lua/plugins/ui.lua @@ -28,31 +28,50 @@ return { }, }, }, - { - "nvim-notify", - }, - { - "bufferline.nvim", + { "akinsho/bufferline.nvim", + event = "VeryLazy", + keys = { + { "bp", "BufferLineTogglePin", desc = "Toggle Pin" }, + { "bP", "BufferLineGroupClose ungrouped", desc = "Delete Non-Pinned Buffers" }, + { "br", "BufferLineCloseRight", desc = "Delete Buffers to the Right" }, + { "bl", "BufferLineCloseLeft", desc = "Delete Buffers to the Left" }, + { "", "BufferLineCyclePrev", desc = "Prev Buffer" }, + { "", "BufferLineCycleNext", desc = "Next Buffer" }, + { "[b", "BufferLineCyclePrev", desc = "Prev Buffer" }, + { "]b", "BufferLineCycleNext", desc = "Next Buffer" }, + { "[B", "BufferLineMovePrev", desc = "Move buffer prev" }, + { "]B", "BufferLineMoveNext", desc = "Move buffer next" }, + }, ---@type BufferlineConfig opts = { options = { + close_command = function(n) Snacks.bufdelete(n) end, + right_mouse_command = function(n) Snacks.bufdelete(n) end, + diagnostics = "nvim_lsp", always_show_bufferline = false, + diagnostics_indicator = function(_, _, diag) + local icons = LazyVim.config.icons.diagnostics + local ret = (diag.error and icons.Error .. diag.error .. " " or "") + .. (diag.warning and icons.Warn .. diag.warning or "") + return vim.trim(ret) + end, + offsets = { + { + filetype = "man", + text = "Man page", + highlight = "Directory", + text_align = "left", + }, + }, + ---@param opts bufferline.IconFetcherOpts + get_element_icon = function(opts) + return LazyVim.config.icons.ft[opts.filetype] + end, }, }, }, - { - "stevearc/dressing.nvim", - lazy = true, - opts = { - input = { - start_in_insert = false, - insert_only = false, - }, - }, - }, - { - "lualine.nvim", - --TODO: Things that were in vim but are missing + { "nvim-lualine/lualine.nvim", + -- TODO: Things that were in vim but are missing -- - git line add/mod/del ar next to branch name rather on right -- - one status line per splits -- - maybe a single one is OK too? @@ -60,12 +79,152 @@ return { -- - unix/dos eof markers -- - really I only want to know if it's not unix -- - filetype in text form. It's quite important to glance this quickly + event = "VeryLazy", + init = function() + vim.g.lualine_laststatus = vim.o.laststatus + if vim.fn.argc(-1) > 0 then + -- set an empty statusline till lualine loads + vim.o.statusline = " " + else + -- hide the statusline on the starter page + vim.o.laststatus = 0 + end + end, + opts = function() + -- PERF: we don't need this lualine require madness 🤷 + local lualine_require = require("lualine_require") + lualine_require.require = require + + local icons = LazyVim.config.icons + + vim.o.laststatus = vim.g.lualine_laststatus + + local opts = { + options = { + theme = "auto", + globalstatus = vim.o.laststatus == 3, + disabled_filetypes = { statusline = { "dashboard", "alpha", "ministarter", "snacks_dashboard" } }, + }, + sections = { + lualine_a = { "mode" }, + lualine_b = { "branch" }, + + lualine_c = { + LazyVim.lualine.root_dir(), + { + "diagnostics", + symbols = { + error = icons.diagnostics.Error, + warn = icons.diagnostics.Warn, + info = icons.diagnostics.Info, + hint = icons.diagnostics.Hint, + }, + }, + { "filetype", icon_only = true, separator = "", padding = { left = 1, right = 0 } }, + { LazyVim.lualine.pretty_path() }, + }, + lualine_x = { + Snacks.profiler.status(), + -- stylua: ignore + { + function() return " " .. require("dap").status() end, + cond = function() return package.loaded["dap"] and require("dap").status() ~= "" end, + color = function() return { fg = Snacks.util.color("Debug") } end, + }, + -- stylua: ignore + { + require("lazy.status").updates, + cond = require("lazy.status").has_updates, + color = function() return { fg = Snacks.util.color("Special") } end, + }, + { + "diff", + symbols = { + added = icons.git.added, + modified = icons.git.modified, + removed = icons.git.removed, + }, + source = function() + local gitsigns = vim.b.gitsigns_status_dict + if gitsigns then + return { + added = gitsigns.added, + modified = gitsigns.changed, + removed = gitsigns.removed, + } + end + end, + }, + }, + lualine_y = { + { "progress", separator = " ", padding = { left = 1, right = 0 } }, + { "location", padding = { left = 0, right = 1 } }, + }, + lualine_z = { + function() + return " " .. os.date("%R") + end, + }, + }, + extensions = { "neo-tree", "lazy", "fzf" }, + } + + local trouble = require("trouble") + local symbols = trouble.statusline({ + mode = "symbols", + groups = {}, + title = false, + filter = { range = true }, + format = "{kind_icon}{symbol.name:Normal}", + hl_group = "lualine_c_normal", + }) + table.insert(opts.sections.lualine_c, { + symbols and symbols.get, + cond = function() + return vim.b.trouble_lualine ~= false and symbols.has() + end, + }) + + return opts + end, }, { - "indent-blankline.nvim", + "echasnovski/mini.icons", + lazy = true, + opts = { + file = { + [".keep"] = { glyph = "󰊢", hl = "MiniIconsGrey" }, + ["devcontainer.json"] = { glyph = "", hl = "MiniIconsAzure" }, + }, + filetype = { + dotenv = { glyph = "", hl = "MiniIconsYellow" }, + }, + }, + init = function() + -- TODO: try without this + -- see :h MiniIcons.mock_nvim_web_devicons() + package.preload["nvim-web-devicons"] = function() + require("mini.icons").mock_nvim_web_devicons() + return package.loaded["nvim-web-devicons"] + end + end, }, - { - "echasnovski/mini.indentscope", + { "MunifTanjim/nui.nvim", lazy = true }, + { "stevearc/dressing.nvim", + enabled = false, -- replaced by snacks.input + lazy = true, + opts = { + input = { + start_in_insert = false, + insert_only = false, + }, + }, + }, + { "indent-blankline.nvim", + enabled = false, -- replaced by snacks.indent + }, + { "echasnovski/mini.indentscope", + enabled = false, -- replaced by snacks.indent version = false, -- wait till new 0.7.0 release to put it back on semver event = "LazyFile", opts = function (_, opts) @@ -76,13 +235,32 @@ return { } end, }, - { - "SmiteshP/nvim-navic", - }, - { - "nvim-web-devicons", + { "SmiteshP/nvim-navic", + lazy = true, + init = function() + vim.g.navic_silence = true + LazyVim.lsp.on_attach(function(client, buffer) + if client.supports_method("textDocument/documentSymbol") then + require("nvim-navic").attach(client, buffer) + end + end) + end, + opts = function() + return { + separator = " ", + highlight = true, + depth_limit = 5, + icons = LazyVim.config.icons.kinds, + lazy_update_context = true, + } + end, }, - { - "nui.nvim", + { "nvim-lualine/lualine.nvim", + optional = true, + opts = function(_, opts) + if not vim.g.trouble_lualine then + table.insert(opts.sections.lualine_c, { "navic", color_correction = "dynamic" }) + end + end, }, } -- 2.48.1