Awesome
🍿 snacks.nvim
A collection of small QoL plugins for Neovim.
✨ Features
Snack | Description | Setup |
---|---|---|
bigfile | Deal with big files | ‼️ |
bufdelete | Delete buffers without disrupting window layout | |
dashboard | Beautiful declarative dashboards | ‼️ |
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 | ‼️ |
⚡️ Requirements
- Neovim >= 0.9.4
- for proper icons support:
- mini.icons (optional)
- nvim-web-devicons (optional)
- a Nerd Font (optional)
📦 Installation
Install the plugin with your package manager:
lazy.nvim
[!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 explicitely pass options for a plugin or set
enabled = true
to enable it.
[!tip] It' a good idea to run
:checkhealth snacks
to see if everything is set up correctly.
{
"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
bigfile = { enabled = true },
notifier = { enabled = true },
quickfile = { enabled = true },
statuscolumn = { enabled = true },
words = { enabled = true },
},
}
For an in-depth setup of snacks.nvim
with lazy.nvim
, check the example below.
⚙️ Configuration
Please refer to the readme of each plugin for their specific configuration.
<details><summary>Default Options</summary> <!-- config:start -->---@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
{
styles = {},
bigfile = { enabled = false },
dashboard = { enabled = false },
notifier = { enabled = false },
quickfile = { enabled = false },
statuscolumn = { enabled = false },
words = { enabled = false },
}
<!-- config:end -->
</details>
🚀 Usage
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 },
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.rename_file() 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,
}
<!-- example:end -->
🌈 Highlight Groups
<details> <summary>Click to see all highlight groups</summary> <!-- hl_start -->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 |
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 |