return { { 'folke/snacks.nvim', priority = 999, lazy = false, ---@type snacks.Config opts = { bigfile = { enabled = true }, dashboard = { enabled = true }, explorer = { enabled = false }, indent = { enabled = true }, input = { enabled = true }, notifier = { enabled = true, timeout = 3000, }, picker = { enabled = true }, quickfile = { enabled = true }, scope = { enabled = true }, scroll = { enabled = false }, statuscolumn = { enabled = true }, words = { enabled = true }, styles = { notification = { -- wo = { wrap = true } -- Wrap notifications }, }, }, keys = { -- find { 'fb', function() Snacks.picker.buffers() end, desc = 'Buffers', }, { 'fc', function() Snacks.picker.files { cwd = vim.fn.stdpath 'config' } end, desc = 'Find Config File', }, { 'ff', function() Snacks.picker.files() end, desc = 'Find Files', }, { 'fg', function() Snacks.picker.git_files() end, desc = 'Find Git Files', }, { 'fp', function() Snacks.picker.projects() end, desc = 'Projects', }, { 'fr', function() Snacks.picker.recent() end, desc = 'Recent', }, -- git { 'gb', function() Snacks.picker.git_branches() end, desc = 'Git Branches', }, { 'gl', function() Snacks.picker.git_log() end, desc = 'Git Log', }, { 'gL', function() Snacks.picker.git_log_line() end, desc = 'Git Log Line', }, { 'gs', function() Snacks.picker.git_status() end, desc = 'Git Status', }, { 'gS', function() Snacks.picker.git_stash() end, desc = 'Git Stash', }, { 'gd', function() Snacks.picker.git_diff() end, desc = 'Git Diff (Hunks)', }, { 'gf', function() Snacks.picker.git_log_file() end, desc = 'Git Log File', }, -- Grep { 'sb', function() Snacks.picker.lines() end, desc = 'Buffer Lines', }, { 'sB', function() Snacks.picker.grep_buffers() end, desc = 'Grep Open Buffers', }, { 'sg', function() Snacks.picker.grep() end, desc = 'Grep', }, { 'sw', function() Snacks.picker.grep_word() end, desc = 'Visual selection or word', mode = { 'n', 'x' }, }, { 'su', function() Snacks.picker.undo() end, desc = 'Undo History', }, { 'uC', function() Snacks.picker.colorschemes() end, desc = 'Colorschemes', }, -- Other { 'z', function() Snacks.zen() end, desc = 'Toggle Zen Mode', }, { 'Z', function() Snacks.zen.zoom() end, desc = 'Toggle Zoom', }, { '.', function() Snacks.scratch() end, desc = 'Toggle Scratch Buffer', }, { 'S', function() Snacks.scratch.select() end, desc = 'Select Scratch Buffer', }, { 'n', function() Snacks.notifier.show_history() end, desc = 'Notification History', }, { 'bd', function() Snacks.bufdelete() end, desc = 'Delete Buffer', }, { 'cR', function() Snacks.rename.rename_file() end, desc = 'Rename File', }, { 'gB', function() Snacks.gitbrowse() end, desc = 'Git Browse', mode = { 'n', 'v' }, }, { 'gg', function() Snacks.lazygit() end, desc = 'Lazygit', }, { 'un', function() Snacks.notifier.hide() end, desc = 'Dismiss All Notifications', }, { '', function() Snacks.terminal() end, desc = 'Toggle Terminal', }, { '', 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' }, }, { '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 'us' Snacks.toggle.option('wrap', { name = 'Wrap' }):map 'uw' Snacks.toggle.option('relativenumber', { name = 'Relative Number' }):map 'uL' Snacks.toggle.diagnostics():map 'ud' Snacks.toggle.line_number():map 'ul' Snacks.toggle.option('conceallevel', { off = 0, on = vim.o.conceallevel > 0 and vim.o.conceallevel or 2 }):map 'uc' Snacks.toggle.treesitter():map 'uT' Snacks.toggle.option('background', { off = 'light', on = 'dark', name = 'Dark Background' }):map 'ub' Snacks.toggle.inlay_hints():map 'uh' Snacks.toggle.indent():map 'ug' Snacks.toggle.dim():map 'uD' end, }) end, }, }