snacks.nvim
A collection of small QoL plugins for Neovim.
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 | ‼️ |
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 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.
Please refer to the readme of each plugin for their specific configuration.
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 },
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,
}