Skip to content

Latest commit

 

History

History
306 lines (268 loc) · 14.7 KB

README.md

File metadata and controls

306 lines (268 loc) · 14.7 KB

🍿 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
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 ‼️
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
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:

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 },
    indent = { enabled = true },
    input = { enabled = true },
    notifier = { enabled = true },
    quickfile = { 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 gitbrowse? snacks.gitbrowse.Config
---@field indent? snacks.indent.Config
---@field input? snacks.input.Config
---@field lazygit? snacks.lazygit.Config
---@field notifier? snacks.notifier.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 },
    indent = { enabled = true },
    input = { enabled = true },
    notifier = {
      enabled = true,
      timeout = 3000,
    },
    quickfile = { enabled = true },
    scroll = { enabled = true },
    statuscolumn = { enabled = true },
    words = { enabled = true },
    styles = {
      notification = {
        -- wo = { wrap = true } -- Wrap notifications
      }
    }
  },
  keys = {
    { "<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>gb", function() Snacks.git.blame_line() end, desc = "Git Blame Line" },
    { "<leader>gf", function() Snacks.lazygit.log_file() end, desc = "Lazygit Current File History" },
    { "<leader>gg", function() Snacks.lazygit() end, desc = "Lazygit" },
    { "<leader>gl", function() Snacks.lazygit.log() end, desc = "Lazygit Log (cwd)" },
    { "<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

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
SnacksScratchKey DiagnosticVirtualText Keymap help in the footer
SnacksScratchDesc DiagnosticInfo Keymap help desc in the footer
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