mirror of
https://github.com/folke/snacks.nvim
synced 2025-08-04 10:49:08 +00:00
🍿 A collection of QoL plugins for Neovim
.github | ||
doc | ||
docs | ||
lua/snacks | ||
plugin | ||
queries/lua | ||
scripts | ||
tests | ||
.editorconfig | ||
.gitignore | ||
CHANGELOG.md | ||
LICENSE | ||
README.md | ||
selene.toml | ||
stylua.toml | ||
vim.toml |
🍿 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 | |
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.
Tip
If you don't need these plugins, you can disable them, or skip
setup
alltogether.
{
"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.
⚙️ Configuration
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 },
}
🚀 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 },
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" },
{ "[[", function() Snacks.words.jump(-vim.v.count1) end, desc = "Prev Reference" },
{
"<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,
}