local wk = require("which-key") local function qflist_is_open() local is_open = false for _, win in ipairs(vim.fn.getwininfo()) do if win.quickfix == 1 then is_open = true break end end return is_open end local function toggle_qf_list() if qflist_is_open() then vim.cmd("cclose") else vim.cmd("copen") end end wk.add({ { "", "h", desc = "Move focus to left pane" }, { "", "j", desc = "Move focus to below pane" }, { "", "k", desc = "Move focus to above pane" }, { "", "l", desc = "Move focus to right pane" }, { "", "5zh", desc = "Scroll left" }, { "", "5zl", desc = "Scroll right" }, { "H", ":bp", desc = "Switch to previous buffer" }, { "L", ":bn", desc = "Switch to next buffer" }, -- Prevents the pane from being removed when closing a buffer { "d", "bpspbnbd", desc = "Close buffer" }, { "D", "bpspbnbd!", desc = "Close buffer (force)" }, -- { "d", "bd", desc = "Close buffer" }, -- { "D", "bd!", desc = "Close buffer (force)" }, { "BD", "bufdo bd", desc = "Close all buffers" }, { "n", "vnew", desc = "New buffer" }, { "", "tabnext", desc = "Next tab", group = "tab" }, { "tn", "tabnew", desc = "New Tab", group = "tab" }, { "td", "tabclose", desc = "Close Tab", group = "tab" }, { "LC", "ConfigLocalEdit", desc = "Edit local nvim config" }, -- { "N", "vsple NOTES.sethetter.md", desc = "Open personal notes" }, { "N", "e NOTES.sethetter.md", desc = "Open personal notes" }, { "/", "CommentToggle", desc = "Toggle comment", mode = { "n" }, }, { "/", ":'<,'>CommentToggle", desc = "Toggle comment", mode = { "v" }, }, -- { "E", "Neotree position=current toggle reveal", desc = "Open file explorer" }, { "E", "Neotree toggle reveal position=current", desc = "Open file explorer" }, { "e", "Neotree toggle position=current", desc = "Open file explorer" }, -- { "E", "Neotree focus reveal position=current", desc = "Open file explorer" }, { "h", "noh", desc = "Clear highlight" }, { "v/", "vsp", desc = "Split vertical", group = "split" }, { "v?", "sp", desc = "Split horizontal", group = "split" }, { "f", "Telescope find_files find_command=rg,--ignore,--hidden,--files,--iglob=!.git sort_mru=true", desc = "Find files", }, { "b", "Telescope buffers", desc = "Buffers" }, { "sp", "Telescope live_grep", desc = "Live grep" }, { "sh", "Telescope help_tags", desc = "Help tags" }, { "sc", "Telescope commands", desc = "Commands" }, { "cl", toggle_qf_list, desc = "Toggle quickfix list", group = "quickfix", }, { "cn", "cnext", desc = "Next QF item", group = "quickfix" }, { "cp", "cprev", desc = "Prev QF item", group = "quickfix" }, { "m", function() vim.diagnostic.setqflist({ open = true, focus = true }) end, desc = "Diagnostics in qf list", }, { "M", "messages", desc = "Messages" }, { "T", ":term ", desc = "Run a terminal command" }, { "o", "AerialToggle", desc = "Symbols outline" }, { "Z", "Goyo", desc = "Goyo toggle" }, { "w", "w", desc = "Save" }, { "X", "x", desc = "Save and close" }, { "q", "q", desc = "Quit" }, { "Q", "qa", desc = "Quit all" }, { "y", function() local filepath = vim.fn.expand('%:.') local line = vim.fn.line('.') local ref = filepath .. ':' .. line vim.fn.system('pbcopy', ref) vim.notify('Copied: ' .. ref, vim.log.levels.INFO) end, desc = "Copy filepath:line to clipboard" }, { "[d", "lua vim.diagnostic.goto_prev()", desc = "Previous diagnostic" }, { "]d", "lua vim.diagnostic.goto_next()", desc = "Next diagnostic" }, { "[g", "Gitsigns prev_hunk", desc = "Previous change" }, { "]g", "Gitsigns next_hunk", desc = "Next change" }, { "K", "lua vim.lsp.buf.hover()", desc = "Hover" }, { "g", group = "goto" }, { "gs", "Telescope lsp_document_symbols", desc = "Document symbols" }, { "gS", "Telescope lsp_dynamic_workspace_symbols", desc = "Workspace symbols" }, { "gD", "lua vim.lsp.buf.declaration()", desc = "Declaration" }, { "gd", "lua vim.lsp.buf.definition()", desc = "Definition" }, { "gi", "lua vim.lsp.buf.implementation()", desc = "Implementation" }, { "gr", "lua vim.lsp.buf.references()", desc = "References" }, { "g.", "lua vim.lsp.buf.code_action()", desc = "Code action" }, { "R", "lua vim.lsp.buf.rename()", desc = "Rename symbol" }, { "F", "Format", desc = "Format buffer" }, { "gg", "LazyGit", desc = "Lazygit", group = "git" }, { "gs", "Telescope git_status", desc = "Git status", group = "git" }, { "gd", "Gitsigns diffthis vertical=true HEAD", desc = "File diff", group = "git" }, { "Gd", ":Gitsigns diffthis vertical=true ", desc = "File diff provided ref", group = "git" }, { "GD", ":DiffviewOpen ", desc = "Diff provided ref", group = "git" }, { "gh", "DiffviewFileHistory %", desc = "File history", group = "git" }, { "gH", "DiffviewFileHistory", desc = "Git history", group = "git" }, { "gb", "Gitsigns toggle_current_line_blame", desc = "Git history", group = "git" }, { "gl", 'lua require("gitlinker").get_buf_range_url("n", {action_callback = require("gitlinker.actions").copy_to_clipboard})', desc = "Copy git url", mode = "n", silent = true, }, { "gl", 'lua require("gitlinker").get_buf_range_url("v", {action_callback = require("gitlinker.actions").copy_to_clipboard})', desc = "Copy git url", mode = "v", -- TODO: make this actually silent silent = true, }, { "PP", "Lazy", desc = "Manage plugins", group = "plugin" }, { "CI", ":CodeCompanion", desc = "Code Companion inline", mode = { "n", "v" }, group = "codecompanion" }, { "CC", ":CodeCompanionChat", desc = "Claude edit selection", mode = { "n", "v" }, group = "codecompanion" }, })