folke / snacks.nvim

🍿 A collection of small QoL plugins for Neovim
Apache License 2.0
1.21k stars 23 forks source link
neovim-plugin

🍿 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

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

Default Options ```lua ---@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 ---@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 }, } ```

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
  },
}

🚀 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,
}

🌈 Highlight Groups

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 | | **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 |