-- Clues Config.leader_group_clues = { { mode = 'n', keys = 'b', desc = '+Buffer' }, { mode = 'n', keys = 'd', desc = '+Debug' }, { mode = 'n', keys = 'e', desc = '+Explore' }, { mode = 'n', keys = 'f', desc = '+Find' }, { mode = 'n', keys = 'g', desc = '+Git' }, { mode = 'n', keys = 'l', desc = '+Language' }, { mode = 'n', keys = 'r', desc = '+Request' }, { mode = 'n', keys = 't', desc = '+Terminal' }, { mode = 'n', keys = '', desc = '+Tab' }, { mode = 'x', keys = 'g', desc = '+Git' }, { mode = 'x', keys = 'l', desc = '+Language' }, } -- Keymap Helpers local nmap_leader = function(suffix, rhs, desc) vim.keymap.set('n', '' .. suffix, rhs, { desc = desc, silent = true }) end local xmap_leader = function(suffix, rhs, desc) vim.keymap.set('x', '' .. suffix, rhs, { desc = desc, silent = true }) end -- Buffers local new_scratch_buffer = function() vim.api.nvim_win_set_buf(0, vim.api.nvim_create_buf(true, true)) end local close_invisible_buffers = function() local visible = vim.iter(vim.api.nvim_list_wins()):map(vim.api.nvim_win_get_buf):totable() vim.iter(vim.api.nvim_list_bufs()) :filter(function(buf) return not vim.list_contains(visible, buf) end) :each(function(buf) pcall(vim.api.nvim_buf_delete, buf, { force = false }) end) end nmap_leader('bd', 'bdelete', 'Delete') nmap_leader('bD', 'bdelete!', 'Delete!') nmap_leader('bs', new_scratch_buffer, 'Scratch') nmap_leader('bw', 'bwipeout', 'Wipeout') nmap_leader('bW', 'bwipeout!', 'Wipeout!') nmap_leader('bo', close_invisible_buffers, 'Close invisible buffers') -- Debug nmap_leader('db', 'lua require("dap").toggle_breakpoint()', 'Toggle Breakpoint') nmap_leader('dl', 'lua require("dap").set_breakpoint(nil, nil, vim.fn.input("Log point: "))', 'Log point') nmap_leader('dc', 'lua require("dap").continue()', 'Run/Continue') nmap_leader('dC', 'lua require("dap").run_to_cursor()', 'Run to Cursor') nmap_leader('de', 'lua require("dap.ui.widgets").hover()', 'Inspect') nmap_leader('dr', 'lua require("dap").repl.open()', 'Open REPL') nmap_leader('dt', 'lua require("dap").terminate()', 'Terminate') -- Explore local explore_at_file = function() local file = vim.api.nvim_buf_get_name(0) MiniFiles.open(vim.uv.fs_stat(file) and file or nil) end nmap_leader('ed', 'lua MiniFiles.open()', 'Directory') nmap_leader('ef', explore_at_file, 'File directory') nmap_leader('ey', 'lua vim.fn.setreg("+", vim.api.nvim_buf_get_name(0))', 'Yank absolute path') nmap_leader('en', 'messages', 'Notifications') -- Find nmap_leader('fb', 'lua MiniPick.builtin.buffers()', 'Buffers') nmap_leader('fc', 'lua MiniExtra.pickers.git_commits()', 'Commits (all)') nmap_leader('fC', 'lua MiniExtra.pickers.git_commits({ path = "%" })', 'Commits (buf)') nmap_leader('fd', 'lua MiniExtra.pickers.diagnostic({ scope = "all" })', 'Diagnostic workspace') nmap_leader('fD', 'lua MiniExtra.pickers.diagnostic({ scope = "current" })', 'Diagnostic buffer') nmap_leader('ff', 'lua MiniPick.builtin.files()', 'Files') nmap_leader('fg', 'lua MiniPick.builtin.grep_live()', 'Grep live') nmap_leader('fG', 'lua MiniPick.builtin.grep({ pattern = vim.fn.expand("") })', 'Grep word') nmap_leader('fh', 'lua MiniPick.builtin.help()', 'Help tags') nmap_leader('fl', 'lua MiniPick.builtin.buf_lines({ scope = "all" })', 'Lines (all)') nmap_leader('fL', 'lua MiniPick.builtin.buf_lines({ scope = "current" })', 'Lines (buf)') nmap_leader('fr', 'lua MiniPick.builtin.resume()', 'Resume') nmap_leader('fs', 'lua MiniExtra.pickers.lsp({ scope = "workspace_symbol_live" })', 'Symbols workspace') nmap_leader('fS', 'lua MiniExtra.pickers.lsp({ scope = "document_symbol" })', 'Symbols document') nmap_leader('f:', 'lua MiniExtra.pickers.history({ scope = ":" })', 'Command history') -- Git local git_log_cmd = [[Git log --pretty=format:\%h\ \%as\ │\ \%s --topo-order]] local git_log_buf_cmd = git_log_cmd .. ' --follow -- %' nmap_leader('ga', 'Git diff --cached', 'Added diff') nmap_leader('gA', 'Git diff --cached -- %', 'Added diff buffer') nmap_leader('gd', 'Git diff', 'Diff') nmap_leader('gD', 'Git diff -- %', 'Diff buffer') nmap_leader('gl', '' .. git_log_cmd .. '', 'Log') nmap_leader('gL', '' .. git_log_buf_cmd .. '', 'Log buffer') nmap_leader('go', 'lua MiniDiff.toggle_overlay()', 'Toggle overlay') nmap_leader('gs', 'lua MiniGit.show_at_cursor()', 'Show at cursor') xmap_leader('gs', 'lua MiniGit.show_at_cursor()', 'Show at selection') -- Language nmap_leader('la', 'lua vim.lsp.buf.code_action()', 'Actions') nmap_leader('ld', 'lua vim.diagnostic.open_float()', 'Diagnostic popup') nmap_leader('lf', 'lua require("conform").format({ async = true })', 'Format') xmap_leader('lf', 'lua require("conform").format({ async = true })', 'Format selection') nmap_leader('li', 'lua vim.lsp.buf.implementation()', 'Implementation') nmap_leader('lh', 'lua vim.lsp.buf.hover()', 'Hover') nmap_leader('ll', 'lua vim.lsp.codelens.run()', 'Lens') nmap_leader('lr', 'lua vim.lsp.buf.rename()', 'Rename') nmap_leader('lR', 'lua vim.lsp.buf.references()', 'References') nmap_leader('ls', 'lua vim.lsp.buf.definition()', 'Source definition') nmap_leader('lt', 'lua vim.lsp.buf.type_definition()', 'Type definition') -- Request nmap_leader('rs', 'lua require("kulala").run()', 'Send HTTP request') -- Terminal nmap_leader('tT', 'horizontal term', 'Terminal (horizontal)') nmap_leader('tt', 'vertical term', 'Terminal (vertical)') nmap_leader('tc', 'vertical term claude', 'Claude') nmap_leader('tf', 'lua require("terminal").open_terminal_app(vim.o.shell)', 'Terminal (popup)') nmap_leader('tg', 'lua require("terminal").open_terminal_app("lazygit")', 'LazyGit') nmap_leader('ts', 'lua require("terminal").open_terminal_app("lazysql")', 'LazySQL') -- Tabs nmap_leader('', 'tabnew', 'New tab') nmap_leader('d', 'tabclose', 'Close tab') nmap_leader(']', 'tabnext', 'Next tab') nmap_leader('[', 'tabprevious', 'Previous tab') -- Brackets vim.keymap.set('n', ']d', function() vim.diagnostic.jump({ count = 1 }) end, { desc = 'Next diagnostic' }) vim.keymap.set('n', '[d', function() vim.diagnostic.jump({ count = -1 }) end, { desc = 'Previous diagnostic' }) -- Overwrites vim.keymap.set('n', '', 'nohlsearch', { desc = 'Clear highlights', silent = true }) vim.keymap.set('t', '', '', { desc = 'Terminal window navigation', silent = true })