folke / snacks.nvim
- среда, 5 февраля 2025 г. в 00:00:04
🍿 A collection of QoL plugins for Neovim
A collection of small QoL plugins for Neovim.
| Snack | Description | Setup |
|---|---|---|
| animate | Efficient animations including over 45 easing functions (library) | |
| bigfile | Deal with big files | |
| bufdelete | Delete buffers without disrupting window layout | |
| dashboard | Beautiful declarative dashboards | |
| debug | Pretty inspect & backtraces for debugging | |
| dim | Focus on the active scope by dimming the rest | |
| explorer | A file explorer (picker in disguise) | |
| git | Git utilities | |
| gitbrowse | Open the current file, branch, commit, or repo in a browser (e.g. GitHub, GitLab, Bitbucket) | |
| indent | Indent guides and scopes | |
| input | Better vim.ui.input |
|
| layout | Window layouts | |
| lazygit | Open LazyGit in a float, auto-configure colorscheme and integration with Neovim | |
| notifier | Pretty vim.notify |
|
| notify | Utility functions to work with Neovim's vim.notify |
|
| picker | Picker for selecting items | |
| profiler | Neovim lua profiler | |
| quickfile | When doing nvim somefile.txt, it will render the file as quickly as possible, before loading your plugins. |
|
| rename | LSP-integrated file renaming with support for plugins like neo-tree.nvim and mini.files. | |
| scope | Scope detection, text objects and jumping based on treesitter or indent | |
| scratch | Scratch buffers with a persistent file | |
| scroll | Smooth scrolling | |
| statuscolumn | Pretty status column | |
| terminal | Create and toggle floating/split terminals | |
| toggle | Toggle keymaps integrated with which-key icons / colors | |
| util | Utility functions for Snacks (library) | |
| win | Create and manage floating windows or splits | |
| words | Auto-show LSP references and quickly navigate between them | |
| zen | Zen mode • distraction-free coding |
Install the plugin with your package manager:
Important
A couple of plugins require snacks.nvim to be set-up early.
Setup creates some autocmds and does not load any plugins.
Check the code to see what it does.
Caution
You need to explicitly pass options for a plugin or set enabled = true to enable it.
Tip
It's a good idea to run :checkhealth snacks to see if everything is set up correctly.
{
"folke/snacks.nvim",
priority = 1000,
lazy = false,
---@type snacks.Config
opts = {
-- your configuration comes here
-- or leave it empty to use the default settings
-- refer to the configuration section below
bigfile = { enabled = true },
dashboard = { enabled = true },
indent = { enabled = true },
input = { enabled = true },
picker = { enabled = true },
notifier = { enabled = true },
quickfile = { enabled = true },
scroll = { enabled = true },
statuscolumn = { enabled = true },
words = { enabled = true },
},
}For an in-depth setup of snacks.nvim with lazy.nvim, check the example below.
Please refer to the readme of each plugin for their specific configuration.
---@class snacks.Config
---@field animate? snacks.animate.Config
---@field bigfile? snacks.bigfile.Config
---@field dashboard? snacks.dashboard.Config
---@field dim? snacks.dim.Config
---@field explorer? snacks.explorer.Config
---@field gitbrowse? snacks.gitbrowse.Config
---@field indent? snacks.indent.Config
---@field input? snacks.input.Config
---@field layout? snacks.layout.Config
---@field lazygit? snacks.lazygit.Config
---@field notifier? snacks.notifier.Config
---@field picker? snacks.picker.Config
---@field profiler? snacks.profiler.Config
---@field quickfile? snacks.quickfile.Config
---@field scope? snacks.scope.Config
---@field scratch? snacks.scratch.Config
---@field scroll? snacks.scroll.Config
---@field statuscolumn? snacks.statuscolumn.Config
---@field terminal? snacks.terminal.Config
---@field toggle? snacks.toggle.Config
---@field win? snacks.win.Config
---@field words? snacks.words.Config
---@field zen? snacks.zen.Config
---@field styles? table<string, snacks.win.Config>
{}Some plugins have examples in their documentation. You can include them in your config like this:
{
dashboard = { example = "github" }
}If you want to customize options for a plugin after they have been resolved, you
can use the config function:
{
gitbrowse = {
config = function(opts, defaults)
table.insert(opts.remote_patterns, { "my", "custom pattern" })
end
},
}See the example below for how to configure snacks.nvim.
{
"folke/snacks.nvim",
priority = 1000,
lazy = false,
---@type snacks.Config
opts = {
bigfile = { enabled = true },
dashboard = { enabled = true },
indent = { enabled = true },
input = { enabled = true },
notifier = {
enabled = true,
timeout = 3000,
},
picker = { enabled = true },
quickfile = { enabled = true },
scroll = { enabled = true },
statuscolumn = { enabled = true },
words = { enabled = true },
styles = {
notification = {
-- wo = { wrap = true } -- Wrap notifications
}
}
},
keys = {
{ "<leader>z", function() Snacks.zen() end, desc = "Toggle Zen Mode" },
{ "<leader>Z", function() Snacks.zen.zoom() end, desc = "Toggle Zoom" },
{ "<leader>.", function() Snacks.scratch() end, desc = "Toggle Scratch Buffer" },
{ "<leader>S", function() Snacks.scratch.select() end, desc = "Select Scratch Buffer" },
{ "<leader>n", function() Snacks.notifier.show_history() end, desc = "Notification History" },
{ "<leader>bd", function() Snacks.bufdelete() end, desc = "Delete Buffer" },
{ "<leader>cR", function() Snacks.rename.rename_file() end, desc = "Rename File" },
{ "<leader>gB", function() Snacks.gitbrowse() end, desc = "Git Browse", mode = { "n", "v" } },
{ "<leader>gb", function() Snacks.git.blame_line() end, desc = "Git Blame Line" },
{ "<leader>gf", function() Snacks.lazygit.log_file() end, desc = "Lazygit Current File History" },
{ "<leader>gg", function() Snacks.lazygit() end, desc = "Lazygit" },
{ "<leader>gl", function() Snacks.lazygit.log() end, desc = "Lazygit Log (cwd)" },
{ "<leader>un", function() Snacks.notifier.hide() end, desc = "Dismiss All Notifications" },
{ "<c-/>", function() Snacks.terminal() end, desc = "Toggle Terminal" },
{ "<c-_>", function() Snacks.terminal() end, desc = "which_key_ignore" },
{ "]]", function() Snacks.words.jump(vim.v.count1) end, desc = "Next Reference", mode = { "n", "t" } },
{ "[[", function() Snacks.words.jump(-vim.v.count1) end, desc = "Prev Reference", mode = { "n", "t" } },
{
"<leader>N",
desc = "Neovim News",
function()
Snacks.win({
file = vim.api.nvim_get_runtime_file("doc/news.txt", false)[1],
width = 0.6,
height = 0.6,
wo = {
spell = false,
wrap = false,
signcolumn = "yes",
statuscolumn = " ",
conceallevel = 3,
},
})
end,
}
},
init = function()
vim.api.nvim_create_autocmd("User", {
pattern = "VeryLazy",
callback = function()
-- Setup some globals for debugging (lazy-loaded)
_G.dd = function(...)
Snacks.debug.inspect(...)
end
_G.bt = function()
Snacks.debug.backtrace()
end
vim.print = _G.dd -- Override print to use snacks for `:=` command
-- Create some toggle mappings
Snacks.toggle.option("spell", { name = "Spelling" }):map("<leader>us")
Snacks.toggle.option("wrap", { name = "Wrap" }):map("<leader>uw")
Snacks.toggle.option("relativenumber", { name = "Relative Number" }):map("<leader>uL")
Snacks.toggle.diagnostics():map("<leader>ud")
Snacks.toggle.line_number():map("<leader>ul")
Snacks.toggle.option("conceallevel", { off = 0, on = vim.o.conceallevel > 0 and vim.o.conceallevel or 2 }):map("<leader>uc")
Snacks.toggle.treesitter():map("<leader>uT")
Snacks.toggle.option("background", { off = "light", on = "dark", name = "Dark Background" }):map("<leader>ub")
Snacks.toggle.inlay_hints():map("<leader>uh")
Snacks.toggle.indent():map("<leader>ug")
Snacks.toggle.dim():map("<leader>uD")
end,
})
end,
}| Highlight Group | Default Group | Description |
|---|---|---|
| SnacksNormal | NormalFloat | Normal for the float window |
| SnacksWinBar | Title | Title of the window |
| SnacksBackdrop | none | Backdrop |
| SnacksNormalNC | NormalFloat | Normal for non-current windows |
| SnacksWinBarNC | SnacksWinBar | Title for non-current windows |
| SnacksScratchKey | DiagnosticVirtualText | Keymap help in the footer |
| SnacksScratchDesc | DiagnosticInfo | Keymap help desc in the footer |
| SnacksNotifierInfo | none | Notification window for Info |
| SnacksNotifierWarn | none | Notification window for Warn |
| SnacksNotifierDebug | none | Notification window for Debug |
| SnacksNotifierError | none | Notification window for Error |
| SnacksNotifierTrace | none | Notification window for Trace |
| SnacksNotifierIconInfo | none | Icon for Info notification |
| SnacksNotifierIconWarn | none | Icon for Warn notification |
| SnacksNotifierIconDebug | none | Icon for Debug notification |
| SnacksNotifierIconError | none | Icon for Error notification |
| SnacksNotifierIconTrace | none | Icon for Trace notification |
| SnacksNotifierTitleInfo | none | Title for Info notification |
| SnacksNotifierTitleWarn | none | Title for Warn notification |
| SnacksNotifierTitleDebug | none | Title for Debug notification |
| SnacksNotifierTitleError | none | Title for Error notification |
| SnacksNotifierTitleTrace | none | Title for Trace notification |
| SnacksNotifierBorderInfo | none | Border for Info notification |
| SnacksNotifierBorderWarn | none | Border for Warn notification |
| SnacksNotifierBorderDebug | none | Border for Debug notification |
| SnacksNotifierBorderError | none | Border for Error notification |
| SnacksNotifierBorderTrace | none | Border for Trace notification |
| SnacksNotifierFooterInfo | DiagnosticInfo | Footer for Info notification |
| SnacksNotifierFooterWarn | DiagnosticWarn | Footer for Warn notification |
| SnacksNotifierFooterDebug | DiagnosticHint | Footer for Debug notification |
| SnacksNotifierFooterError | DiagnosticError | Footer for Error notification |
| SnacksNotifierFooterTrace | DiagnosticHint | Footer for Trace notification |
| SnacksDashboardNormal | Normal | Normal for the dashboard |
| SnacksDashboardDesc | Special | Description text in dashboard |
| SnacksDashboardFile | Special | Dashboard file items |
| SnacksDashboardDir | NonText | Directory items |
| SnacksDashboardFooter | Title | Dashboard footer text |
| SnacksDashboardHeader | Title | Dashboard header text |
| SnacksDashboardIcon | Special | Dashboard icons |
| SnacksDashboardKey | Number | Keybind text |
| SnacksDashboardTerminal | SnacksDashboardNormal | Terminal text |
| SnacksDashboardSpecial | Special | Special elements |
| SnacksDashboardTitle | Title | Title text |