Home

Awesome

🍿 snacks.nvim

A collection of small QoL plugins for Neovim.

✨ Features

SnackDescriptionSetup
bigfileDeal with big files‼️
bufdeleteDelete buffers without disrupting window layout
dashboardBeautiful declarative dashboards‼️
debugPretty inspect & backtraces for debugging
gitUseful functions for Git
gitbrowseOpen the repo of the active file in the browser (e.g., GitHub)
lazygitOpen LazyGit in a float, auto-configure colorscheme and integration with Neovim
notifyUtility functions to work with Neovim's vim.notify
notifierBetter and prettier vim.notify‼️
quickfileWhen doing nvim somefile.txt, it will render the file as quickly as possible, before loading your plugins.‼️
renameLSP-integrated file renaming with support for plugins like neo-tree.nvim and mini.files.
statuscolumnPretty statuscolumn‼️
terminalCreate and toggle floating/split terminals
toggleToggle keymaps integrated with which-key icons / colors
winEasily create and manage floating windows or splits
wordsAuto-show LSP references and quickly navigate between them‼️

⚡️ Requirements

📦 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.

<!-- example:start -->
{
  "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 GroupDefault GroupDescription
SnacksNormalNormalFloatNormal for the float window
SnacksWinBarTitleTitle of the window
SnacksBackdropnoneBackdrop
SnacksNormalNCNormalFloatNormal for non-current windows
SnacksWinBarNCSnacksWinBarTitle for non-current windows
SnacksNotifierInfononeNotification window for Info
SnacksNotifierWarnnoneNotification window for Warn
SnacksNotifierDebugnoneNotification window for Debug
SnacksNotifierErrornoneNotification window for Error
SnacksNotifierTracenoneNotification window for Trace
SnacksNotifierIconInfononeIcon for Info notification
SnacksNotifierIconWarnnoneIcon for Warn notification
SnacksNotifierIconDebugnoneIcon for Debug notification
SnacksNotifierIconErrornoneIcon for Error notification
SnacksNotifierIconTracenoneIcon for Trace notification
SnacksNotifierTitleInfononeTitle for Info notification
SnacksNotifierTitleWarnnoneTitle for Warn notification
SnacksNotifierTitleDebugnoneTitle for Debug notification
SnacksNotifierTitleErrornoneTitle for Error notification
SnacksNotifierTitleTracenoneTitle for Trace notification
SnacksNotifierBorderInfononeBorder for Info notification
SnacksNotifierBorderWarnnoneBorder for Warn notification
SnacksNotifierBorderDebugnoneBorder for Debug notification
SnacksNotifierBorderErrornoneBorder for Error notification
SnacksNotifierBorderTracenoneBorder for Trace notification
SnacksNotifierFooterInfoDiagnosticInfoFooter for Info notification
SnacksNotifierFooterWarnDiagnosticWarnFooter for Warn notification
SnacksNotifierFooterDebugDiagnosticHintFooter for Debug notification
SnacksNotifierFooterErrorDiagnosticErrorFooter for Error notification
SnacksNotifierFooterTraceDiagnosticHintFooter for Trace notification
SnacksDashboardNormalNormalNormal for the dashboard
SnacksDashboardDescSpecialDescription text in dashboard
SnacksDashboardFileSpecialDashboard file items
SnacksDashboardDirNonTextDirectory items
SnacksDashboardFooterTitleDashboard footer text
SnacksDashboardHeaderTitleDashboard header text
SnacksDashboardIconSpecialDashboard icons
SnacksDashboardKeyNumberKeybind text
SnacksDashboardTerminalSnacksDashboardNormalTerminal text
SnacksDashboardSpecialSpecialSpecial elements
SnacksDashboardTitleTitleTitle text
<!-- hl_end --> </details>