🍿 A collection of QoL plugins for Neovim
Find a file
github-actions[bot] 789f161de1
chore(main): release 2.19.0 (#888)
🤖 I have created a release *beep* *boop*
---


##
[2.19.0](https://github.com/folke/snacks.nvim/compare/v2.18.0...v2.19.0)
(2025-02-07)


### Features

* **bigfile:** configurable average line length (default = 1000). Useful
for minified files. Closes
[#576](https://github.com/folke/snacks.nvim/issues/576). Closes
[#372](https://github.com/folke/snacks.nvim/issues/372)
([7fa92a2](7fa92a2450))
* **explorer:** add hl groups for ignored / hidden files. Closes
[#887](https://github.com/folke/snacks.nvim/issues/887)
([85e1b34](85e1b343b0))
* **explorer:** added ctrl+f to grep in the item's directory
([0454b21](0454b21165))
* **explorer:** added ctrl+t to open a terminal in the item's directory
([81f9006](81f90062c5))
* **explorer:** added diagnostics file/directory status
([7f1b60d](7f1b60d557))
* **explorer:** added quick nav with `[`, `]` with `d/w/e` for
diagnostics
([d1d5585](d1d55850ec))
* **explorer:** added support for live search
([82c4a50](82c4a50985))
* **explorer:** allow disabling untracked git status. Closes
[#983](https://github.com/folke/snacks.nvim/issues/983)
([a3b083b](a3b083b844))
* **explorer:** different hl group for broken links
([1989921](1989921466))
* **explorer:** disable fuzzy searches by default for explorer since
it's too noisy and we can't sort on score due to tree view
([b07788f](b07788f14a))
* **explorer:** file watcher when explorer is open
([6936c14](6936c1491d))
* **explorer:** file watching that works on all platforms
([8399465](8399465872))
* **explorer:** focus on first file when searching in the explorer
([1d4bea4](1d4bea4a9e))
* **explorer:** git index watcher
([4c12475](4c12475e80))
* **explorer:** rewrite that no longer depends on `fd` for exploring
([6149a7b](6149a7babb))
* **explorer:** show symlink target
([dfa79e0](dfa79e0443))
* **matcher:** call on_match after setting score
([23ce529](23ce529fb6))
* **picker.git:** add confirmation before deleting a git branch
([#951](https://github.com/folke/snacks.nvim/issues/951))
([337a3ae](337a3ae7ee))
* **picker.git:** add create and delete branch to git_branches
([#909](https://github.com/folke/snacks.nvim/issues/909))
([8676c40](8676c409e1))
* **picker.lazy:** don't use `grep`. Parse spec files manually. Closes
[#972](https://github.com/folke/snacks.nvim/issues/972)
([0928007](09280078e8))
* **picker.lsp:** use existing buffers for preview when opened
([d4e6353](d4e63531c9))
* **picker.matcher:** internal `on_match`
([47b3b69](47b3b69570))
* **picker.preview:** allow confguring `preview = {main = true, enabled
= false}`
([1839c65](1839c65f67))
* **picker.undo:** added ctrl+y to yank added lines from undo
([811a24c](811a24cc16))
* **picker:** `picker:dir()` to get the dir of the item (when a
directory) or it's parent (when a file)
([969608a](969608ab79))
* **picker:** added `git_grep` picker. Closes
[#986](https://github.com/folke/snacks.nvim/issues/986)
([2dc9016](2dc901634b))
* **picker:** allow configuring file icon width. Closes
[#981](https://github.com/folke/snacks.nvim/issues/981)
([52c1086](52c1086ecd))
* **picker:** better checkhealth
([b773368](b773368f8a))
* **picker:** get filetype from modeline when needed. Closes
[#987](https://github.com/folke/snacks.nvim/issues/987)
([5af04ab](5af04ab667))
* **picker:** opts.on_close
([6235f44](6235f44b11))
* **picker:** pin picker as a split to left/bottom/top/right with
`ctrl+z+(hjkl)`
([27cba53](27cba535a6))
* **rename:** add `old` to `on_rename` callback
([455228e](455228ed3a))
* **scope:** allow injected languages to be parsed by treesitter
([#823](https://github.com/folke/snacks.nvim/issues/823))
([aba21dd](aba21ddc71))
* **statuscolumn:** added mouse click handler to open/close folds.
Closes [#968](https://github.com/folke/snacks.nvim/issues/968)
([98a7b64](98a7b647c9))
* **terminal:** added `start_insert`
([64129e4](64129e4c3c))
* **terminal:** auto_close and auto_insert. Closes
[#965](https://github.com/folke/snacks.nvim/issues/965)
([bb76cae](bb76cae87e))


### Bug Fixes

* **bigfile:** check that passed path is the one from the buffer
([8deea64](8deea64dba))
* **explorer.git:** better git status watching
([09349ec](09349ecd44))
* **explorer.git:** dont reset cursor when git status is done updating
([bc87992](bc87992e71))
* **explorer.git:** vim.schedule git updates
([3aad761](3aad761620))
* **explorer.tree:** fix linux
([6f5399b](6f5399b47c))
* **explorer.tree:** symlink directories
([e5f1e91](e5f1e91249))
* **explorer.watch:** pcall watcher, since it can give errors on windows
([af96818](af968181af))
* **explorer:** always refresh state when opening the picker since
changes might have happened that were not monitored
([c61114f](c61114fb32))
* **explorer:** call original `on_close`. Closes
[#971](https://github.com/folke/snacks.nvim/issues/971)
([a0bee9f](a0bee9f662))
* **explorer:** check that picker is still open
([50fa1be](50fa1be38e))
* **explorer:** clear cache after action. Fixes
[#890](https://github.com/folke/snacks.nvim/issues/890)
([34097ff](34097ff37e))
* **explorer:** clear selection after delete. Closes
[#898](https://github.com/folke/snacks.nvim/issues/898)
([44733ea](44733eaa78))
* **explorer:** disable follow for explorer search by default. No longer
needed. Link directories may show as files then though, but that's not
an issue. See [#960](https://github.com/folke/snacks.nvim/issues/960)
([b9a17d8](b9a17d82a7))
* **explorer:** don't use --absolute-path option, since that resolves
paths to realpath. See
[#901](https://github.com/folke/snacks.nvim/issues/901). See
[#905](https://github.com/folke/snacks.nvim/issues/905). See
[#904](https://github.com/folke/snacks.nvim/issues/904)
([97570d2](97570d23ac))
* **explorer:** dont focus first file when not searching
([3fd437c](3fd437ccd3))
* **explorer:** dont process git when picker closed
([c255d9c](c255d9c6a0))
* **explorer:** last status for indent guides taking hidden / ignored
files into account
([94bd2ef](94bd2eff74))
* **explorer:** strip cwd from search text for explorer items
([38f392a](38f392a8ad))
* **explorer:** windows
([b560054](b560054669))
* **exporer.tree:** and now hopefully on windows
([ef9b12d](ef9b12d680))
* **git:** use nul char as separator for git status
([8e0dfd2](8e0dfd2856))
* **health:** better health checks for picker. Closes
[#917](https://github.com/folke/snacks.nvim/issues/917)
([427f036](427f036c65))
* **picker.actions:** close preview before buffer delete
([762821e](762821e420))
* **picker.actions:** don't reuse_win in floating windows (like the
picker preview)
([4b9ea98](4b9ea98007))
* **picker.actions:** fix qflist position
([#911](https://github.com/folke/snacks.nvim/issues/911))
([6d3c135](6d3c135235))
* **picker.actions:** get win after splitting or tabnew. Fixes
[#896](https://github.com/folke/snacks.nvim/issues/896)
([95d3e7f](95d3e7f961))
* **picker.colorscheme:** use wildignore. Closes
[#969](https://github.com/folke/snacks.nvim/issues/969)
([ba8badf](ba8badfe74))
* **picker.db:** better script to download sqlite3 on windows. See
[#918](https://github.com/folke/snacks.nvim/issues/918)
([84d1a92](84d1a92fab))
* **picker.finder:** correct check if filter changed
([52bc24c](52bc24c232))
* **picker.input:** fixed startinsert weirdness with prompt buffers
(again)
([c030827](c030827d7a))
* **picker.input:** set as not modified when setting input through API
([54a041f](54a041f7fc))
* **picker.list:** better wrap settings for when wrapping is enabled
([a542ea4](a542ea4d34))
* **picker.list:** let user override wrap
([22da4bd](22da4bd511))
* **picker.list:** nil check
([c22e46a](c22e46ab9a))
* **picker.lsp:** fix indent guides for sorted document symbols
([17360e4](17360e4009))
* **picker.lsp:** sort document symbols by position
([cc22177](cc22177dcf))
* **picker.matcher:** don't optimize pattern subsets when pattern has a
negation
([a6b3d78](a6b3d7840b))
* **picker.preview:** don't clear preview state on close so that
colorscheme can be restored. Closes
[#932](https://github.com/folke/snacks.nvim/issues/932)
([9688bd9](9688bd92cd))
* **picker.preview:** update main preview when changing the layout
([604c603](604c603dfa))
* **picker.projects:** add custom project dirs
([c7293bd](c7293bdfe7))
* **picker.projects:** use fd or fdfind
([270250c](270250cf46))
* **picker.select:** default height shows just the items. See
[#902](https://github.com/folke/snacks.nvim/issues/902)
([c667622](c667622fb7))
* **picker:** better handling when entering the root layout window.
Closes [#894](https://github.com/folke/snacks.nvim/issues/894)
([e294fd8](e294fd8a27))
* **picker:** consider zen windows as main. Closes
[#973](https://github.com/folke/snacks.nvim/issues/973)
([b1db65a](b1db65ac61))
* **picker:** disabled preview main
([9fe43bd](9fe43bdf9b))
* **picker:** exit insert mode before closing with `<c-c>` to
prevent cursor shifting left. Close
[#956](https://github.com/folke/snacks.nvim/issues/956)
([71eae96](71eae96bfa))
* **picker:** initial preview state when main
([cd6e336](cd6e336ec0))
* **picker:** only show extmark errors when debug is enabled. Closes
[#988](https://github.com/folke/snacks.nvim/issues/988)
([f6d9af7](f6d9af7410))
* **win:** apply win-local window options for new buffers displayed in a
window. Fixes [#925](https://github.com/folke/snacks.nvim/issues/925)
([cb99c46](cb99c46fa1))
* **win:** better handling of alien buffers opening in managed windows.
See [#886](https://github.com/folke/snacks.nvim/issues/886)
([c8430fd](c8430fdd8d))


### Performance Improvements

* **explorer:** disable watchdirs fallback watcher
([5d34380](5d34380310))
* **explorer:** early exit for tree calculation
([1a30610](1a30610ab7))
* **explorer:** no need to get git status with `-uall`. Closes
[#983](https://github.com/folke/snacks.nvim/issues/983)
([bc087d3](bc087d36d6))
* **picker.list:** only re-render when visible items changed
([c72e62e](c72e62ef90))
* **picker:** cache treesitter line highlights
([af31c31](af31c31287))
* **picker:** cache wether ts lang exists and disable smooth scrolling
on big files
([719b36f](719b36fa70))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-02-07 12:39:13 +01:00
.github feat(dashboard): added new dashboard snack (#77) 2024-11-18 16:25:17 +01:00
doc chore(build): auto-generate docs 2025-02-07 05:20:50 +00:00
docs chore(build): auto-generate docs 2025-02-07 10:41:33 +00:00
lua fix(picker): only show extmark errors when debug is enabled. Closes #988 2025-02-07 11:39:45 +01:00
plugin feat: ensure Snacks global is available when not using setup 2024-11-04 16:39:24 +01:00
queries/lua feat: config & setup 2024-11-03 12:56:05 +01:00
scripts ci: docgen 2024-12-10 13:55:51 +01:00
tests fix(util): normkey. Closes #763 2025-02-03 07:09:28 +01:00
.editorconfig ci: integrated with ci scripts 2024-11-03 09:04:33 +01:00
.gitignore ci: gitignore 2025-01-30 17:56:14 +01:00
CHANGELOG.md chore(main): release 2.19.0 (#888) 2025-02-07 12:39:13 +01:00
LICENSE ci: integrated with ci scripts 2024-11-03 09:04:33 +01:00
README.md chore(build): auto-generate docs 2025-02-06 08:39:20 +00:00
selene.toml feat: initial commit 2024-11-02 23:24:33 +01:00
stylua.toml feat: initial commit 2024-11-02 23:24:33 +01:00
vim.toml feat: initial commit 2024-11-02 23:24:33 +01:00

🍿 snacks.nvim

A collection of small QoL plugins for Neovim.

Features

Snack Description Setup
animate Efficient animations including over 45 easing functions (library)
bigfile Deal with big files ‼️
bufdelete Delete buffers without disrupting window layout
dashboard Beautiful declarative dashboards ‼️
debug Pretty inspect & backtraces for debugging
dim Focus on the active scope by dimming the rest
explorer A file explorer (picker in disguise) ‼️
git Git utilities
gitbrowse Open the current file, branch, commit, or repo in a browser (e.g. GitHub, GitLab, Bitbucket)
indent Indent guides and scopes
input Better vim.ui.input ‼️
layout Window layouts
lazygit Open LazyGit in a float, auto-configure colorscheme and integration with Neovim
notifier Pretty vim.notify ‼️
notify Utility functions to work with Neovim's vim.notify
picker Picker for selecting items ‼️
profiler Neovim lua profiler
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.
scope Scope detection, text objects and jumping based on treesitter or indent ‼️
scratch Scratch buffers with a persistent file
scroll Smooth scrolling ‼️
statuscolumn Pretty status column ‼️
terminal Create and toggle floating/split terminals
toggle Toggle keymaps integrated with which-key icons / colors
util Utility functions for Snacks (library)
win Create and manage floating windows or splits
words Auto-show LSP references and quickly navigate between them ‼️
zen Zen mode • distraction-free coding

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 explicitly pass options for a plugin or set enabled = true to enable it.

Tip

It's a good idea to run :checkhealth snacks to see if everything is set up correctly.

{
  "folke/snacks.nvim",
  priority = 1000,
  lazy = false,
  ---@type snacks.Config
  opts = {
    -- your configuration comes here
    -- or leave it empty to use the default settings
    -- refer to the configuration section below
    bigfile = { enabled = true },
    dashboard = { enabled = true },
    explorer = { enabled = true },
    indent = { enabled = true },
    input = { enabled = true },
    picker = { enabled = true },
    notifier = { enabled = true },
    quickfile = { enabled = true },
    scope = { enabled = true },
    scroll = { 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
---@class snacks.Config
---@field animate? snacks.animate.Config
---@field bigfile? snacks.bigfile.Config
---@field dashboard? snacks.dashboard.Config
---@field dim? snacks.dim.Config
---@field explorer? snacks.explorer.Config
---@field gitbrowse? snacks.gitbrowse.Config
---@field indent? snacks.indent.Config
---@field input? snacks.input.Config
---@field layout? snacks.layout.Config
---@field lazygit? snacks.lazygit.Config
---@field notifier? snacks.notifier.Config
---@field picker? snacks.picker.Config
---@field profiler? snacks.profiler.Config
---@field quickfile? snacks.quickfile.Config
---@field scope? snacks.scope.Config
---@field scratch? snacks.scratch.Config
---@field scroll? snacks.scroll.Config
---@field statuscolumn? snacks.statuscolumn.Config
---@field terminal? snacks.terminal.Config
---@field toggle? snacks.toggle.Config
---@field win? snacks.win.Config
---@field words? snacks.words.Config
---@field zen? snacks.zen.Config
---@field styles? table<string, snacks.win.Config>
{}

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 },
    explorer = { enabled = true },
    indent = { enabled = true },
    input = { enabled = true },
    notifier = {
      enabled = true,
      timeout = 3000,
    },
    picker = { enabled = true },
    quickfile = { enabled = true },
    scope = { enabled = true },
    scroll = { enabled = true },
    statuscolumn = { enabled = true },
    words = { enabled = true },
    styles = {
      notification = {
        -- wo = { wrap = true } -- Wrap notifications
      }
    }
  },
  keys = {
    -- Top Pickers & Explorer
    { "<leader><space>", function() Snacks.picker.smart() end, desc = "Smart Find Files" },
    { "<leader>,", function() Snacks.picker.buffers() end, desc = "Buffers" },
    { "<leader>/", function() Snacks.picker.grep() end, desc = "Grep" },
    { "<leader>:", function() Snacks.picker.command_history() end, desc = "Command History" },
    { "<leader>n", function() Snacks.picker.notifications() end, desc = "Notification History" },
    { "<leader>e", function() Snacks.explorer() end, desc = "File Explorer" },
    -- find
    { "<leader>fb", function() Snacks.picker.buffers() end, desc = "Buffers" },
    { "<leader>fc", function() Snacks.picker.files({ cwd = vim.fn.stdpath("config") }) end, desc = "Find Config File" },
    { "<leader>ff", function() Snacks.picker.files() end, desc = "Find Files" },
    { "<leader>fg", function() Snacks.picker.git_files() end, desc = "Find Git Files" },
    { "<leader>fp", function() Snacks.picker.projects() end, desc = "Projects" },
    { "<leader>fr", function() Snacks.picker.recent() end, desc = "Recent" },
    -- git
    { "<leader>gb", function() Snacks.picker.git_branches() end, desc = "Git Branches" },
    { "<leader>gl", function() Snacks.picker.git_log() end, desc = "Git Log" },
    { "<leader>gL", function() Snacks.picker.git_log_line() end, desc = "Git Log Line" },
    { "<leader>gs", function() Snacks.picker.git_status() end, desc = "Git Status" },
    { "<leader>gS", function() Snacks.picker.git_stash() end, desc = "Git Stash" },
    { "<leader>gd", function() Snacks.picker.git_diff() end, desc = "Git Diff (Hunks)" },
    { "<leader>gf", function() Snacks.picker.git_log_file() end, desc = "Git Log File" },
    -- Grep
    { "<leader>sb", function() Snacks.picker.lines() end, desc = "Buffer Lines" },
    { "<leader>sB", function() Snacks.picker.grep_buffers() end, desc = "Grep Open Buffers" },
    { "<leader>sg", function() Snacks.picker.grep() end, desc = "Grep" },
    { "<leader>sw", function() Snacks.picker.grep_word() end, desc = "Visual selection or word", mode = { "n", "x" } },
    -- search
    { '<leader>s"', function() Snacks.picker.registers() end, desc = "Registers" },
    { '<leader>s/', function() Snacks.picker.search_history() end, desc = "Search History" },
    { "<leader>sa", function() Snacks.picker.autocmds() end, desc = "Autocmds" },
    { "<leader>sb", function() Snacks.picker.lines() end, desc = "Buffer Lines" },
    { "<leader>sc", function() Snacks.picker.command_history() end, desc = "Command History" },
    { "<leader>sC", function() Snacks.picker.commands() end, desc = "Commands" },
    { "<leader>sd", function() Snacks.picker.diagnostics() end, desc = "Diagnostics" },
    { "<leader>sD", function() Snacks.picker.diagnostics_buffer() end, desc = "Buffer Diagnostics" },
    { "<leader>sh", function() Snacks.picker.help() end, desc = "Help Pages" },
    { "<leader>sH", function() Snacks.picker.highlights() end, desc = "Highlights" },
    { "<leader>si", function() Snacks.picker.icons() end, desc = "Icons" },
    { "<leader>sj", function() Snacks.picker.jumps() end, desc = "Jumps" },
    { "<leader>sk", function() Snacks.picker.keymaps() end, desc = "Keymaps" },
    { "<leader>sl", function() Snacks.picker.loclist() end, desc = "Location List" },
    { "<leader>sm", function() Snacks.picker.marks() end, desc = "Marks" },
    { "<leader>sM", function() Snacks.picker.man() end, desc = "Man Pages" },
    { "<leader>sp", function() Snacks.picker.lazy() end, desc = "Search for Plugin Spec" },
    { "<leader>sq", function() Snacks.picker.qflist() end, desc = "Quickfix List" },
    { "<leader>sR", function() Snacks.picker.resume() end, desc = "Resume" },
    { "<leader>su", function() Snacks.picker.undo() end, desc = "Undo History" },
    { "<leader>uC", function() Snacks.picker.colorschemes() end, desc = "Colorschemes" },
    -- LSP
    { "gd", function() Snacks.picker.lsp_definitions() end, desc = "Goto Definition" },
    { "gD", function() Snacks.picker.lsp_declarations() end, desc = "Goto Declaration" },
    { "gr", function() Snacks.picker.lsp_references() end, nowait = true, desc = "References" },
    { "gI", function() Snacks.picker.lsp_implementations() end, desc = "Goto Implementation" },
    { "gy", function() Snacks.picker.lsp_type_definitions() end, desc = "Goto T[y]pe Definition" },
    { "<leader>ss", function() Snacks.picker.lsp_symbols() end, desc = "LSP Symbols" },
    { "<leader>sS", function() Snacks.picker.lsp_workspace_symbols() end, desc = "LSP Workspace Symbols" },
    -- Other
    { "<leader>z",  function() Snacks.zen() end, desc = "Toggle Zen Mode" },
    { "<leader>Z",  function() Snacks.zen.zoom() end, desc = "Toggle Zoom" },
    { "<leader>.",  function() Snacks.scratch() end, desc = "Toggle Scratch Buffer" },
    { "<leader>S",  function() Snacks.scratch.select() end, desc = "Select Scratch Buffer" },
    { "<leader>n",  function() Snacks.notifier.show_history() end, desc = "Notification History" },
    { "<leader>bd", function() Snacks.bufdelete() end, desc = "Delete Buffer" },
    { "<leader>cR", function() Snacks.rename.rename_file() end, desc = "Rename File" },
    { "<leader>gB", function() Snacks.gitbrowse() end, desc = "Git Browse", mode = { "n", "v" } },
    { "<leader>gg", function() Snacks.lazygit() end, desc = "Lazygit" },
    { "<leader>un", function() Snacks.notifier.hide() end, desc = "Dismiss All Notifications" },
    { "<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")
        Snacks.toggle.indent():map("<leader>ug")
        Snacks.toggle.dim():map("<leader>uD")
      end,
    })
  end,
}

🌈 Highlight Groups

Snacks defines a lot of highlight groups and it's impossible to document them all.

Instead, you can use the picker to see all the highlight groups.

Snacks.picker.highlights({pattern = "hl_group:^Snacks"})