return { "folke/snacks.nvim", priority = 1000, lazy = false, ---@type snacks.Config opts = { bigfile = { enabled = true }, explorer = { enabled = true, replace_netrw = true }, indent = { enabled = true }, input = { enabled = true }, notifier = { enabled = true, timeout = 3000, }, picker = { enabled = true }, quickfile = { enabled = true }, scroll = { enabled = false }, statuscolumn = { enabled = true }, words = { enabled = true }, styles = { notification = {}, }, }, keys = { -- Top Pickers & Explorer { "", function() Snacks.picker.buffers() end, desc = "Buffers", }, { "e", function() Snacks.explorer() end, desc = "File Explorer", }, -- config { "cc", function() Snacks.picker.files({ cwd = vim.fn.stdpath("config") }) end, desc = "Find Config File", }, -- search { "sf", function() Snacks.picker.files() end, desc = "Find Files", }, { "sl", function() Snacks.picker.lines() end, desc = "Buffer Lines", }, { "sg", function() Snacks.picker.grep() end, desc = "Grep", }, { "sB", function() Snacks.picker.grep_buffers() end, desc = "Grep Open Buffers", }, { "sw", function() Snacks.picker.grep_word() end, desc = "Visual selection or word", mode = { "n", "x" }, }, { "sp", function() Snacks.picker.projects() end, desc = "Projects", }, { "sc", function() Snacks.picker.commands() end, desc = "Commands", }, { "sd", function() Snacks.picker.diagnostics() end, desc = "Diagnostics", }, { "sD", function() Snacks.picker.diagnostics_buffer() end, desc = "Buffer Diagnostics", }, { "sh", function() Snacks.picker.help() end, desc = "Help Pages", }, { "sH", function() Snacks.picker.highlights() end, desc = "Highlights", }, { "sj", function() Snacks.picker.jumps() end, desc = "Jumps", }, { "sk", function() Snacks.picker.keymaps() end, desc = "Keymaps", }, { "sM", function() Snacks.picker.man() end, desc = "Man Pages", }, { "sq", function() Snacks.picker.qflist() end, desc = "Quickfix List", }, { "sR", function() Snacks.picker.resume() end, desc = "Resume", }, { "su", function() Snacks.picker.undo() end, desc = "Undo History", }, { "co", 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", }, { "ss", function() Snacks.picker.lsp_symbols({ filter = { default = { "Class", "Constructor", "Enum", "Field", "Function", "Interface", "Method", "Module", "Namespace", "Package", "Property", "Struct", "Trait", "Variable", }, }, }) end, desc = "LSP Symbols", }, { "sw", function() Snacks.picker.lsp_workspace_symbols() end, desc = "LSP Workspace Symbols", }, { "ca", function() vim.lsp.buf.code_action() end, desc = "Code actions", }, { "rn", function() vim.lsp.buf.rename() end, desc = "Rename symbols", }, -- 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", }, { "mv", function() Snacks.rename.rename_file() end, desc = "Move File", }, { "gg", function() Snacks.lazygit() end, desc = "Lazygit", }, { "un", function() Snacks.notifier.hide() end, desc = "Dismiss All Notifications", }, { "", 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, }