return { { "folke/snacks.nvim", opts = {}, keys = { -- Top level picker { ",", function() Snacks.picker.buffers() end, desc = "Buffers", }, { "/", function() Snacks.picker.grep() end, desc = "Grep (Root Dir)", }, { ":", function() Snacks.picker.command_history() end, desc = "Command History", }, { "", function() Snacks.picker.smart() end, desc = "Smart Open", }, { "n", function() Snacks.picker.notifications() end, desc = "Notification History", }, -- buffers { "bb", function() Snacks.picker.buffers() end, desc = "Buffers", }, { "bd", function() Snacks.bufdelete() end, desc = "Delete Buffer", }, { "bo", function() Snacks.bufdelete.other() end, desc = "Delete Other Buffers", }, -- find { "fb", function() Snacks.picker.buffers() end, desc = "Buffers", }, { "fB", function() Snacks.picker.buffers { hidden = true, nofile = true } end, desc = "Buffers (all)", }, { "ff", function() Snacks.picker.files() end, desc = "Find Files (root dir)", }, { "fF", function() Snacks.picker.files { root = false } end, desc = "Find Files (cwd)", }, { "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 { cwd = require("rc.utils").find_git_root() } 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" }, }, -- search { 's"', function() Snacks.picker.registers() end, desc = "Registers", }, { "s/", function() Snacks.picker.search_history() end, desc = "Search History", }, { "sa", function() Snacks.picker.autocmds() end, desc = "Autocmds", }, { "sb", function() Snacks.picker.lines() end, desc = "Buffer Lines", }, { "sc", function() Snacks.picker.command_history() end, desc = "Command History", }, { "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", }, { "si", function() Snacks.picker.icons() end, desc = "Icons", }, { "sj", function() Snacks.picker.jumps() end, desc = "Jumps", }, { "sk", function() Snacks.picker.keymaps() end, desc = "Keymaps", }, { "sl", function() Snacks.picker.loclist() end, desc = "Location List", }, { "sm", function() Snacks.picker.marks() end, desc = "Marks", }, { "sM", function() Snacks.picker.man() end, desc = "Man Pages", }, { "sp", function() Snacks.picker.lazy() end, desc = "Search for Plugin Spec", }, { "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", }, { "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", }, { "ss", function() Snacks.picker.lsp_symbols() end, desc = "LSP Symbols", }, { "sS", function() Snacks.picker.lsp_workspace_symbols() end, desc = "LSP Workspace Symbols", }, }, }, { "folke/snacks.nvim", opts = function(_, opts) if require("rc.utils.lazy").has_plugin "trouble.nvim" then return vim.tbl_deep_extend("force", opts or {}, { picker = { actions = { trouble_open = function(...) return require("trouble.sources.snacks").actions.trouble_open.action(...) end, }, win = { input = { keys = { [""] = { "trouble_open", mode = { "n", "i" }, }, }, }, }, }, }) end end, }, { "neovim/nvim-lspconfig", opts = function() local Keys = require("rc.plugins.lsp.keymaps").get_keys() vim.list_extend(Keys, { { "gd", function() Snacks.picker.lsp_definitions() end, desc = "Goto Definition", has = "textDocument/definition", }, { "gr", function() Snacks.picker.lsp_references() end, nowait = true, desc = "References", has = "textDocument/references", }, { "gI", function() Snacks.picker.lsp_implementations() end, desc = "Goto Implementation", has = "textDocument/implementation", }, { "gy", function() Snacks.picker.lsp_type_definitions() end, desc = "Goto T[y]pe Definition", }, { "ss", function() Snacks.picker.lsp_symbols() end, desc = "LSP Symbols", has = "textDocument/documentSymbol", }, { "sS", function() Snacks.picker.lsp_workspace_symbols() end, desc = "LSP Workspace Symbols", has = "workspace/symbols", }, }) end, }, { "folke/todo-comments.nvim", optional = true, keys = { { "st", function() Snacks.picker.todo_comments() end, desc = "Todo", }, { "sT", function() Snacks.picker.todo_comments { keywords = { "TODO", "FIX", "FIXME" } } end, desc = "Todo/Fix/Fixme", }, }, }, { "folke/snacks.nvim", opts = function(_, opts) table.insert(opts.dashboard.preset.keys, 3, { icon = " ", key = "p", desc = "Projects", action = ":lua Snacks.picker.projects()", }) end, }, { "folke/flash.nvim", optional = true, specs = { { "folke/snacks.nvim", opts = { picker = { win = { input = { keys = { [""] = { "flash", mode = { "n", "i" } }, ["s"] = { "flash" }, }, }, }, actions = { flash = function(picker) require("flash").jump { pattern = "^", label = { after = { 0, 0 } }, search = { mode = "search", exclude = { function(win) return vim.bo[vim.api.nvim_win_get_buf(win)].filetype ~= "snacks_picker_list" end, }, }, action = function(match) local idx = picker.list:row2idx(match.pos[1]) picker.list:_move(idx, true, true) end, } end, }, }, }, }, }, }, }