mirror of
https://github.com/LazyVim/LazyVim.git
synced 2025-06-21 16:39:06 +02:00
## What is this PR for? <!-- Describe the big picture of your changes to communicate to the maintainers why we should accept this pull request. --> Provide language specific file icons. The intent is to lay the foundation of this type of extension / configuration. I've added icons for file types that I interact with but this is definitely not holistic. I also went back and forth on whether the configuration should be within the core UI config or in the extras (I landed on the later). Definitely open to feedback on these changes. ## Does this PR fix an existing issue? <!-- If this PR fixes any issues, please link to the issue here. - Fixes #<issue_number> --> Nope. ## Checklist - [x] I've read the [CONTRIBUTING](https://github.com/LazyVim/LazyVim/blob/main/CONTRIBUTING.md) guidelines. --------- Co-authored-by: Folke Lemaitre <folke.lemaitre@gmail.com>
395 lines
14 KiB
Lua
395 lines
14 KiB
Lua
return {
|
|
-- Better `vim.notify()`
|
|
{
|
|
"rcarriga/nvim-notify",
|
|
keys = {
|
|
{
|
|
"<leader>un",
|
|
function()
|
|
require("notify").dismiss({ silent = true, pending = true })
|
|
end,
|
|
desc = "Dismiss All Notifications",
|
|
},
|
|
},
|
|
opts = {
|
|
stages = "static",
|
|
timeout = 3000,
|
|
max_height = function()
|
|
return math.floor(vim.o.lines * 0.75)
|
|
end,
|
|
max_width = function()
|
|
return math.floor(vim.o.columns * 0.75)
|
|
end,
|
|
on_open = function(win)
|
|
vim.api.nvim_win_set_config(win, { zindex = 100 })
|
|
end,
|
|
},
|
|
init = function()
|
|
-- when noice is not enabled, install notify on VeryLazy
|
|
if not LazyVim.has("noice.nvim") then
|
|
LazyVim.on_very_lazy(function()
|
|
vim.notify = require("notify")
|
|
end)
|
|
end
|
|
end,
|
|
},
|
|
|
|
-- This is what powers LazyVim's fancy-looking
|
|
-- tabs, which include filetype icons and close buttons.
|
|
{
|
|
"akinsho/bufferline.nvim",
|
|
event = "VeryLazy",
|
|
keys = {
|
|
{ "<leader>bp", "<Cmd>BufferLineTogglePin<CR>", desc = "Toggle Pin" },
|
|
{ "<leader>bP", "<Cmd>BufferLineGroupClose ungrouped<CR>", desc = "Delete Non-Pinned Buffers" },
|
|
{ "<leader>bo", "<Cmd>BufferLineCloseOthers<CR>", desc = "Delete Other Buffers" },
|
|
{ "<leader>br", "<Cmd>BufferLineCloseRight<CR>", desc = "Delete Buffers to the Right" },
|
|
{ "<leader>bl", "<Cmd>BufferLineCloseLeft<CR>", desc = "Delete Buffers to the Left" },
|
|
{ "<S-h>", "<cmd>BufferLineCyclePrev<cr>", desc = "Prev Buffer" },
|
|
{ "<S-l>", "<cmd>BufferLineCycleNext<cr>", desc = "Next Buffer" },
|
|
{ "[b", "<cmd>BufferLineCyclePrev<cr>", desc = "Prev Buffer" },
|
|
{ "]b", "<cmd>BufferLineCycleNext<cr>", desc = "Next Buffer" },
|
|
{ "[B", "<cmd>BufferLineMovePrev<cr>", desc = "Move buffer prev" },
|
|
{ "]B", "<cmd>BufferLineMoveNext<cr>", desc = "Move buffer next" },
|
|
},
|
|
opts = {
|
|
options = {
|
|
-- stylua: ignore
|
|
close_command = function(n) LazyVim.ui.bufremove(n) end,
|
|
-- stylua: ignore
|
|
right_mouse_command = function(n) LazyVim.ui.bufremove(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 = "neo-tree",
|
|
text = "Neo-tree",
|
|
highlight = "Directory",
|
|
text_align = "left",
|
|
},
|
|
},
|
|
---@param opts bufferline.IconFetcherOpts
|
|
get_element_icon = function(opts)
|
|
return LazyVim.config.icons.ft[opts.filetype]
|
|
end,
|
|
},
|
|
},
|
|
config = function(_, opts)
|
|
require("bufferline").setup(opts)
|
|
-- Fix bufferline when restoring a session
|
|
vim.api.nvim_create_autocmd({ "BufAdd", "BufDelete" }, {
|
|
callback = function()
|
|
vim.schedule(function()
|
|
pcall(nvim_bufferline)
|
|
end)
|
|
end,
|
|
})
|
|
end,
|
|
},
|
|
|
|
-- statusline
|
|
{
|
|
"nvim-lualine/lualine.nvim",
|
|
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" } },
|
|
},
|
|
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 = {
|
|
-- stylua: ignore
|
|
{
|
|
function() return require("noice").api.status.command.get() end,
|
|
cond = function() return package.loaded["noice"] and require("noice").api.status.command.has() end,
|
|
color = function() return LazyVim.ui.fg("Statement") end,
|
|
},
|
|
-- stylua: ignore
|
|
{
|
|
function() return require("noice").api.status.mode.get() end,
|
|
cond = function() return package.loaded["noice"] and require("noice").api.status.mode.has() end,
|
|
color = function() return LazyVim.ui.fg("Constant") end,
|
|
},
|
|
-- stylua: ignore
|
|
{
|
|
function() return " " .. require("dap").status() end,
|
|
cond = function() return package.loaded["dap"] and require("dap").status() ~= "" end,
|
|
color = function() return LazyVim.ui.fg("Debug") end,
|
|
},
|
|
-- stylua: ignore
|
|
{
|
|
require("lazy.status").updates,
|
|
cond = require("lazy.status").has_updates,
|
|
color = function() return LazyVim.ui.fg("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" },
|
|
}
|
|
|
|
-- do not add trouble symbols if aerial is enabled
|
|
if vim.g.trouble_lualine and LazyVim.has("trouble.nvim") then
|
|
local trouble = require("trouble")
|
|
local symbols = trouble.statusline
|
|
and 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 = symbols and symbols.has,
|
|
})
|
|
end
|
|
|
|
return opts
|
|
end,
|
|
},
|
|
|
|
-- indent guides for Neovim
|
|
{
|
|
"lukas-reineke/indent-blankline.nvim",
|
|
event = "LazyFile",
|
|
opts = {
|
|
indent = {
|
|
char = "│",
|
|
tab_char = "│",
|
|
},
|
|
scope = { show_start = false, show_end = false },
|
|
exclude = {
|
|
filetypes = {
|
|
"help",
|
|
"alpha",
|
|
"dashboard",
|
|
"neo-tree",
|
|
"Trouble",
|
|
"trouble",
|
|
"lazy",
|
|
"mason",
|
|
"notify",
|
|
"toggleterm",
|
|
"lazyterm",
|
|
},
|
|
},
|
|
},
|
|
main = "ibl",
|
|
},
|
|
|
|
-- Highly experimental plugin that completely replaces the UI for messages, cmdline and the popupmenu.
|
|
{
|
|
"folke/noice.nvim",
|
|
event = "VeryLazy",
|
|
opts = {
|
|
lsp = {
|
|
override = {
|
|
["vim.lsp.util.convert_input_to_markdown_lines"] = true,
|
|
["vim.lsp.util.stylize_markdown"] = true,
|
|
["cmp.entry.get_documentation"] = true,
|
|
},
|
|
},
|
|
routes = {
|
|
{
|
|
filter = {
|
|
event = "msg_show",
|
|
any = {
|
|
{ find = "%d+L, %d+B" },
|
|
{ find = "; after #%d+" },
|
|
{ find = "; before #%d+" },
|
|
},
|
|
},
|
|
view = "mini",
|
|
},
|
|
},
|
|
presets = {
|
|
bottom_search = true,
|
|
command_palette = true,
|
|
long_message_to_split = true,
|
|
},
|
|
},
|
|
-- stylua: ignore
|
|
keys = {
|
|
{ "<leader>sn", "", desc = "+noice"},
|
|
{ "<S-Enter>", function() require("noice").redirect(vim.fn.getcmdline()) end, mode = "c", desc = "Redirect Cmdline" },
|
|
{ "<leader>snl", function() require("noice").cmd("last") end, desc = "Noice Last Message" },
|
|
{ "<leader>snh", function() require("noice").cmd("history") end, desc = "Noice History" },
|
|
{ "<leader>sna", function() require("noice").cmd("all") end, desc = "Noice All" },
|
|
{ "<leader>snd", function() require("noice").cmd("dismiss") end, desc = "Dismiss All" },
|
|
{ "<leader>snt", function() require("noice").cmd("pick") end, desc = "Noice Picker (Telescope/FzfLua)" },
|
|
{ "<c-f>", function() if not require("noice.lsp").scroll(4) then return "<c-f>" end end, silent = true, expr = true, desc = "Scroll Forward", mode = {"i", "n", "s"} },
|
|
{ "<c-b>", function() if not require("noice.lsp").scroll(-4) then return "<c-b>" end end, silent = true, expr = true, desc = "Scroll Backward", mode = {"i", "n", "s"}},
|
|
},
|
|
config = function(_, opts)
|
|
-- HACK: noice shows messages from before it was enabled,
|
|
-- but this is not ideal when Lazy is installing plugins,
|
|
-- so clear the messages in this case.
|
|
if vim.o.filetype == "lazy" then
|
|
vim.cmd([[messages clear]])
|
|
end
|
|
require("noice").setup(opts)
|
|
end,
|
|
},
|
|
|
|
-- icons
|
|
{
|
|
"echasnovski/mini.icons",
|
|
lazy = true,
|
|
opts = {
|
|
file = {
|
|
[".keep"] = { glyph = "", hl = "MiniIconsGrey" },
|
|
["CODEOWNERS"] = { glyph = "", hl = "MiniIconsGreen" },
|
|
["devcontainer.json"] = { glyph = "", hl = "MiniIconsAzure" },
|
|
},
|
|
filetype = {
|
|
dotenv = { glyph = "", hl = "MiniIconsYellow" },
|
|
},
|
|
},
|
|
init = function()
|
|
package.preload["nvim-web-devicons"] = function()
|
|
require("mini.icons").mock_nvim_web_devicons()
|
|
return package.loaded["nvim-web-devicons"]
|
|
end
|
|
end,
|
|
},
|
|
|
|
-- ui components
|
|
{ "MunifTanjim/nui.nvim", lazy = true },
|
|
|
|
{
|
|
"nvimdev/dashboard-nvim",
|
|
lazy = false, -- As https://github.com/nvimdev/dashboard-nvim/pull/450, dashboard-nvim shouldn't be lazy-loaded to properly handle stdin.
|
|
opts = function()
|
|
local logo = [[
|
|
██╗ █████╗ ███████╗██╗ ██╗██╗ ██╗██╗███╗ ███╗ Z
|
|
██║ ██╔══██╗╚══███╔╝╚██╗ ██╔╝██║ ██║██║████╗ ████║ Z
|
|
██║ ███████║ ███╔╝ ╚████╔╝ ██║ ██║██║██╔████╔██║ z
|
|
██║ ██╔══██║ ███╔╝ ╚██╔╝ ╚██╗ ██╔╝██║██║╚██╔╝██║ z
|
|
███████╗██║ ██║███████╗ ██║ ╚████╔╝ ██║██║ ╚═╝ ██║
|
|
╚══════╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═══╝ ╚═╝╚═╝ ╚═╝
|
|
]]
|
|
|
|
logo = string.rep("\n", 8) .. logo .. "\n\n"
|
|
|
|
local opts = {
|
|
theme = "doom",
|
|
hide = {
|
|
-- this is taken care of by lualine
|
|
-- enabling this messes up the actual laststatus setting after loading a file
|
|
statusline = false,
|
|
},
|
|
config = {
|
|
header = vim.split(logo, "\n"),
|
|
-- stylua: ignore
|
|
center = {
|
|
{ action = 'lua LazyVim.pick()()', desc = " Find File", icon = " ", key = "f" },
|
|
{ action = "ene | startinsert", desc = " New File", icon = " ", key = "n" },
|
|
{ action = 'lua LazyVim.pick("oldfiles")()', desc = " Recent Files", icon = " ", key = "r" },
|
|
{ action = 'lua LazyVim.pick("live_grep")()', desc = " Find Text", icon = " ", key = "g" },
|
|
{ action = 'lua LazyVim.pick.config_files()()', desc = " Config", icon = " ", key = "c" },
|
|
{ action = 'lua require("persistence").load()', desc = " Restore Session", icon = " ", key = "s" },
|
|
{ action = "LazyExtras", desc = " Lazy Extras", icon = " ", key = "x" },
|
|
{ action = "Lazy", desc = " Lazy", icon = " ", key = "l" },
|
|
{ action = function() vim.api.nvim_input("<cmd>qa<cr>") end, desc = " Quit", icon = " ", key = "q" },
|
|
},
|
|
footer = function()
|
|
local stats = require("lazy").stats()
|
|
local ms = (math.floor(stats.startuptime * 100 + 0.5) / 100)
|
|
return { "⚡ Neovim loaded " .. stats.loaded .. "/" .. stats.count .. " plugins in " .. ms .. "ms" }
|
|
end,
|
|
},
|
|
}
|
|
|
|
for _, button in ipairs(opts.config.center) do
|
|
button.desc = button.desc .. string.rep(" ", 43 - #button.desc)
|
|
button.key_format = " %s"
|
|
end
|
|
|
|
-- open dashboard after closing lazy
|
|
if vim.o.filetype == "lazy" then
|
|
vim.api.nvim_create_autocmd("WinClosed", {
|
|
pattern = tostring(vim.api.nvim_get_current_win()),
|
|
once = true,
|
|
callback = function()
|
|
vim.schedule(function()
|
|
vim.api.nvim_exec_autocmds("UIEnter", { group = "dashboard" })
|
|
end)
|
|
end,
|
|
})
|
|
end
|
|
|
|
return opts
|
|
end,
|
|
},
|
|
}
|