return { "folke/which-key.nvim", init = function() local wk = require("which-key") wk.add({ { "", ":m .+1==", desc = "Move line down" }, { "", ":m .-2==", desc = "Move line up" }, { mode = "v", { "", ":m '>+1gv=gv", desc = "Move line down" }, { "", ":m '<-2gv=gv", desc = "Move line up" }, }, { mode = "i", { "", ":m .+1==gi", desc = "Move line down" }, { "", ":m .-2==gi", desc = "Move line up" }, }, { "", "Commander", desc = "Commander" }, { "", function() local git_root = Snacks.git.get_root() if git_root then Snacks.picker.git_files() else Snacks.picker.files() end end, desc = "Find git files" }, { ",", group = "Search" }, { ",p", ":lua Snacks.picker.files()", desc = "Files files" }, { ",b", ":lua Snacks.picker.buffers()", desc = "Buffer List" }, { ",q", ":lua Snacks.picker.qflist()", desc = "Quickfix" }, { ",c", ":lua Snacks.picker.command_history()", desc = "Quickfix" }, { ",e", ":e **/*", desc = "Open with autocomplete" }, { ",f", ":find **/*", desc = "Find with autocomplete" }, { "p", group = "Search" }, { "pc", ":lua Snacks.picker.git_log()", desc = "Git commits" }, { "pf", ":lua Snacks.picker.git_log_file()", desc = "Git file history" }, { "pb", ":lua Snacks.picker.git_branches()", desc = "Git branches" }, { "ph", ":lua Snacks.picker.git_status()", desc = "Git status" }, { "ps", ":lua Snacks.picker.grep()", desc = "Project search" }, { "pr", ":lua Snacks.picker.resume()", desc = "Picker: resume" }, { "ds", function() local function pick_cmd_result(picker_opts) local function finder(opts, ctx) return require("snacks.picker.source.proc").proc({ opts, { cmd = picker_opts.cmd, args = picker_opts.args, transform = function(item) -- item.cwd = picker_opts.cwd or git_root item.file = item.text end, }, }, ctx) end Snacks.picker.pick { source = picker_opts.name, finder = finder, preview = picker_opts.preview, title = picker_opts.title, } end local custom_pickers = {} function custom_pickers.nvim() pick_cmd_result { cmd = "fd", args = { ".", vim.fn.stdpath('config'), "--type", "f" }, name = "nvim config", title = "Nvim config", preview = "file", } end custom_pickers.nvim() end, desc = "Search dot files 🔭", }, { "R", desc = "Kulala HTTP", }, { "R,", ":lua Snacks.picker.files({ft='http'})", desc = "Search request files", }, { "K", "Lspsaga hover_doc", desc = "Show documentation" }, { "", "Lspsaga hover_doc ++keep", desc = "Show documentation (keep)" }, { "grn", "Lspsaga rename", desc = "Rename variable" }, { "g", group = "Go to" }, { "gd", ":Lspsaga goto_definition", desc = "Go to definition" }, { "gD", function() vim.lsp.buf.declaration() end, desc = "Go to declaration", }, { "gt", ":Lspsaga goto_type_definition", desc = "Go to type definition" }, { "gh", ":Lspsaga finder", desc = "LSP Finder" }, { "gH", ":Lspsaga finder ++normal", desc = "LSP Finder (keep)" }, { "a", group = "Local File Actions" }, { "gra", mode = { "n", "v" }, "Lspsaga code_action", desc = "Code action" }, { "ag", function() vim.diagnostic.open_float(0, { scope = "line", focusable = false }) end, desc = "Show line diagnostics", }, { "grp", function() require("overlook.api").peek_definition() end, desc = "Peek", }, { "grd", "Glance definitions", desc = "Definitions", }, { "grr", "Glance references", desc = "References", }, { "gri", "Glance implementations", desc = "Implementations", }, { "grt", "Glance type_definitions", desc = "Type definitions", }, { "grI", "Lspsaga incoming_calls", desc = "Incoming calls", }, { "grO", "Lspsaga outgoing_calls", desc = "Outgoing calls", }, { "gO", "Lspsaga outline", desc = "Toggle Outline", icon = "󰷐", }, { "g", group = "Git", }, { "gs", "Neogit", desc = "Git status (Neogit)", }, { "gd", "DiffviewOpen", desc = "Diff view", }, { "gl", function() require("neogit").action("log", "log_current")() end, desc = "Git log", }, { "gf", "Neogit", desc = "Git diff current file", }, { "T", group = "Tabs" }, { "TT", "tabs", desc = "Tabs list" }, { "Tn", "tabnext", desc = "Next Tab" }, { "Tp", "tabprevious", desc = "Previous Tab" }, { "Tf", "tabfirst", desc = "First Tab" }, { "Tl", "tablast", desc = "Last Tab" }, { "TN", "tabnew", desc = "New Tab" }, { "Tc", "tabclose", desc = "Close Tab" }, { "»", "]", noremap = false, }, { "«", "[", noremap = false, }, { "g", group = "git signs" }, { "gs", function() require("gitsigns").stage_hunk() end, desc = "Stage hunk", }, { "gu", function() require("gitsigns").undo_stage_hunk() end, desc = "Undo stage hunk", }, { "gv", function() require("gitsigns").preview_hunk() end, desc = "Preview hunk", }, { "gb", function() require("gitsigns").blame_line() end, desc = "Blame line", }, { "gB", function() require("gitsigns").blame() end, desc = "Blame line", }, { "gR", function() require("gitsigns").reset_buffer() end, desc = "Reset buffer", }, { "gr", function() require("gitsigns").reset_hunk() end, desc = "Reset hunk", }, { "gS", function() require("gitsigns").stage_buffer() end, desc = "Stage buffer", }, { "gU", function() require("gitsigns").reset_buffer_index() end, desc = "Reset buffer index", }, { mode = "v", { "gs", function() require("gitsigns").stage_hunk({ vim.fn.line("."), vim.fn.line("v") }) end, desc = "Stage hunk", }, { "gr", function() require("gitsigns").reset_hunk({ vim.fn.line("."), vim.fn.line("v") }) end, desc = "Reset hunk", }, }, { "]c", function() if vim.wo.diff then vim.cmd.normal({ "]c", bang = true }) else vim.schedule(function() require("gitsigns").nav_hunk("next") end) end end, desc = "Next hunk", }, { "[c", function() if vim.wo.diff then vim.cmd.normal({ "[c", bang = true }) else vim.schedule(function() require("gitsigns").nav_hunk("prev") end) end end, desc = "Previous hunk", }, { "u", "UndotreeToggle", desc = "Undotree", icon = "" }, { "c", group = "quickfix" }, { "co", "copen", desc = "Open" }, { "cc", "cclose", desc = "Close" }, { "c", group = "Location List" }, { "co", "lopen", desc = "Open" }, { "cc", "lclose", desc = "Close" }, { "", "Neotree toggle", desc = "Toggle neo-tree" }, { "t", "lua Snacks.terminal.toggle()", desc = "Toggle Terminal" }, { mode = { "t" }, { "t", "lua Snacks.terminal.toggle()", desc = "Toggle Terminal" } }, { mode = { "n", "x", "o" }, { "s", function() require("flash").jump() end, desc = "Flash ⚡", }, { "S", function() require("flash").treesitter() end, desc = "Flash Treesitter ⚡", }, }, { mode = { "o", "x" }, { "R", function() require("flash").treesitter_search() end, desc = "Flash Treesitter search ⚡", }, }, { mode = "o", { "r", function() -- https://www.lorenzobettini.it/2025/05/using-flash-remote-in-neovim/ require("flash").remote() end, desc = "Flash remote ⚡", }, }, { mode = "c", { "", function() require("flash").toggle() end, desc = "Toggle Flash Search ⚡", }, }, }) end, }