A collection of small QoL plugins for Neovim.
Snack | Description | Setup |
---|---|---|
bigfile | Deal with big files | |
bufdelete | Delete buffers without disrupting window layout | |
debug | Pretty inspect & backtraces for debugging | |
git | Useful functions for Git | |
gitbrowse | Open the repo of the active file in the browser (e.g., GitHub) | |
lazygit | Open LazyGit in a float, auto-configure colorscheme and integration with Neovim | |
notify | Utility functions to work with Neovim's vim.notify |
|
notifier | Better and prettier vim.notify |
|
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. | |
statuscolumn | Pretty statuscolumn | |
terminal | Create and toggle floating/split terminals | |
toggle | Toggle keymaps integrated with which-key icons / colors | |
win | Easily create and manage floating windows or splits | |
words | Auto-show LSP references and quickly navigate between them |
- 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.
Tip
If you don't need these plugins, you can disable them, or skip setup
altogether.
{
"folke/snacks.nvim",
priority = 1000,
lazy = false,
opts = {
-- your configuration comes here
-- or leave it empty to use the default settings
-- refer to the configuration section below
},
}
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 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 terminal? snacks.terminal.Config
---@field toggle? snacks.toggle.Config
---@field styles? table<string, snacks.win.Config>
---@field win? snacks.win.Config
---@field words? snacks.words.Config
{
styles = {},
bigfile = { enabled = true },
notifier = { enabled = true },
quickfile = { enabled = true },
statuscolumn = { enabled = true },
words = { enabled = true },
}
See the example below for how to configure snacks.nvim
.
{
"folke/snacks.nvim",
priority = 1000,
lazy = false,
---@type snacks.Config
opts = {
bigfile = { enabled = true },
notifier = {
enabled = true,
timeout = 3000,
},
quickfile = { enabled = true },
statuscolumn = { enabled = true },
words = { enabled = true },
styles = {
notification = {
wo = { wrap = true } -- Wrap notifications
}
}
},
keys = {
{ "<leader>un", function() Snacks.notifier.hide() end, desc = "Dismiss All Notifications" },
{ "<leader>bd", function() Snacks.bufdelete() end, desc = "Delete Buffer" },
{ "<leader>gg", function() Snacks.lazygit() end, desc = "Lazygit" },
{ "<leader>gb", function() Snacks.git.blame_line() end, desc = "Git Blame Line" },
{ "<leader>gB", function() Snacks.gitbrowse() end, desc = "Git Browse" },
{ "<leader>gf", function() Snacks.lazygit.log_file() end, desc = "Lazygit Current File History" },
{ "<leader>gl", function() Snacks.lazygit.log() end, desc = "Lazygit Log (cwd)" },
{ "<leader>cR", function() Snacks.rename() end, desc = "Rename File" },
{ "<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")
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 |
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 |