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 | |
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 |
|
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 |
|
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 |
- Neovim >= 0.9.4
- for proper icons support:
- mini.icons (optional)
- nvim-web-devicons (optional)
- a Nerd Font (optional)
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 },
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.
Default Options
---@class snacks.Config
---@field animate? snacks.animate.Config
---@field bigfile? snacks.bigfile.Config
---@field dashboard? snacks.dashboard.Config
---@field dim? snacks.dim.Config
---@field gitbrowse? snacks.gitbrowse.Config
---@field indent? snacks.indent.Config
---@field input? snacks.input.Config
---@field lazygit? snacks.lazygit.Config
---@field notifier? snacks.notifier.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,
},
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,
}
Click to see all highlight groups
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 |