mirror of
https://github.com/folke/snacks.nvim
synced 2025-08-04 10:49:08 +00:00
141 lines
3.9 KiB
Lua
141 lines
3.9 KiB
Lua
---@class Snacks
|
|
---@field bigfile snacks.bigfile
|
|
---@field bufdelete snacks.bufdelete
|
|
---@field config snacks.config
|
|
---@field dashboard snacks.dashboard
|
|
---@field debug snacks.debug
|
|
---@field git snacks.git
|
|
---@field gitbrowse snacks.gitbrowse
|
|
---@field lazygit snacks.lazygit
|
|
---@field notifier snacks.notifier
|
|
---@field notify snacks.notify
|
|
---@field quickfile snacks.quickfile
|
|
---@field health snacks.health
|
|
---@field rename snacks.rename
|
|
---@field statuscolumn snacks.statuscolumn
|
|
---@field terminal snacks.terminal
|
|
---@field toggle snacks.toggle
|
|
---@field util snacks.util
|
|
---@field win snacks.win
|
|
---@field words snacks.words
|
|
local M = {}
|
|
|
|
setmetatable(M, {
|
|
__index = function(t, k)
|
|
---@diagnostic disable-next-line: no-unknown
|
|
t[k] = require("snacks." .. k)
|
|
return t[k]
|
|
end,
|
|
})
|
|
|
|
_G.Snacks = M
|
|
|
|
---@class snacks.Config
|
|
---@field bigfile? snacks.bigfile.Config | { enabled: boolean }
|
|
---@field gitbrowse? snacks.gitbrowse.Config
|
|
---@field lazygit? snacks.lazygit.Config
|
|
---@field notifier? snacks.notifier.Config | { enabled: boolean }
|
|
---@field quickfile? { enabled: boolean }
|
|
---@field statuscolumn? snacks.statuscolumn.Config | { enabled: boolean }
|
|
---@field styles? table<string, snacks.win.Config>
|
|
---@field dashboard? snacks.dashboard.Config | { enabled: boolean }
|
|
---@field terminal? snacks.terminal.Config
|
|
---@field toggle? snacks.toggle.Config
|
|
---@field win? snacks.win.Config
|
|
---@field words? snacks.words.Config
|
|
local config = {
|
|
styles = {},
|
|
bigfile = { enabled = false },
|
|
dashboard = { enabled = false },
|
|
notifier = { enabled = false },
|
|
quickfile = { enabled = false },
|
|
statuscolumn = { enabled = false },
|
|
words = { enabled = false },
|
|
}
|
|
|
|
---@class snacks.config: snacks.Config
|
|
M.config = setmetatable({}, {
|
|
__index = function(_, k)
|
|
return config[k]
|
|
end,
|
|
})
|
|
|
|
---@generic T: table
|
|
---@param snack string
|
|
---@param defaults T
|
|
---@param ... T[]
|
|
---@return T
|
|
function M.config.get(snack, defaults, ...)
|
|
local merge = { vim.deepcopy(defaults), vim.deepcopy(config[snack] or {}) }
|
|
for i = 1, select("#", ...) do
|
|
local v = select(i, ...)
|
|
if v then
|
|
table.insert(merge, vim.deepcopy(v))
|
|
end
|
|
end
|
|
return vim.tbl_deep_extend("force", unpack(merge))
|
|
end
|
|
|
|
--- Register a new window style config.
|
|
---@param name string
|
|
---@param defaults snacks.win.Config
|
|
function M.config.style(name, defaults)
|
|
config.styles[name] = vim.tbl_deep_extend("force", vim.deepcopy(defaults), config.styles[name] or {})
|
|
end
|
|
|
|
M.did_setup = false
|
|
|
|
---@param opts snacks.Config?
|
|
function M.setup(opts)
|
|
if M.did_setup then
|
|
return vim.notify("snacks.nvim is already setup", vim.log.levels.ERROR, { title = "snacks.nvim" })
|
|
end
|
|
M.did_setup = true
|
|
opts = opts or {}
|
|
-- enable all by default when config is passed
|
|
for k in pairs(opts) do
|
|
opts[k].enabled = opts[k].enabled == nil or opts[k].enabled
|
|
end
|
|
config = vim.tbl_deep_extend("force", config, opts or {})
|
|
|
|
if vim.fn.has("nvim-0.9.4") ~= 1 then
|
|
return vim.notify("snacks.nvim requires Neovim >= 0.9.4", vim.log.levels.ERROR, { title = "snacks.nvim" })
|
|
end
|
|
|
|
local group = vim.api.nvim_create_augroup("snacks", { clear = true })
|
|
|
|
local events = {
|
|
BufReadPre = { "bigfile" },
|
|
BufReadPost = { "quickfile" },
|
|
LspAttach = { "words" },
|
|
UIEnter = { "dashboard" },
|
|
}
|
|
|
|
for event, snacks in pairs(events) do
|
|
vim.api.nvim_create_autocmd(event, {
|
|
group = group,
|
|
once = true,
|
|
nested = true,
|
|
callback = function()
|
|
for _, snack in ipairs(snacks) do
|
|
if M.config[snack].enabled then
|
|
M[snack].setup()
|
|
end
|
|
end
|
|
end,
|
|
})
|
|
end
|
|
|
|
if M.config.statuscolumn.enabled then
|
|
vim.o.statuscolumn = [[%!v:lua.require'snacks.statuscolumn'.get()]]
|
|
end
|
|
|
|
if M.config.notifier.enabled then
|
|
vim.notify = function(msg, level, o)
|
|
vim.notify = Snacks.notifier.notify
|
|
return Snacks.notifier.notify(msg, level, o)
|
|
end
|
|
end
|
|
end
|
|
|
|
return M
|