local kmGroup = vim.api.nvim_create_augroup("KeymappingsGroup", { clear = true }) local kmgAutocmd = vim.api.nvim_create_autocmd ------------------------------------------------------------------------------------------ -- core -- explore the directory of the current file (using netrw) vim.keymap.set("n", "n", vim.cmd.Ex) -- move visually-selected lines up or down vim.keymap.set("v", "J", ":m '>+1gv") vim.keymap.set("v", "K", ":m '<-2gv") -- reduce effective distance of half-page jumps and vertically-center the cursor vim.keymap.set("n", "", "4M") vim.keymap.set("n", "", "4M") -- open folds when iterating search results vim.keymap.set("n", "n", "nzv") vim.keymap.set("n", "N", "Nzv") -- maintain cursor position after paragraph formatting vim.keymap.set("n", "=ap", "mF=ap'F") -- shortcuts for deleting into the void register vim.keymap.set({ "n", "v" }, "d", [["_d]]) vim.keymap.set("x", "P", [["_dP]]) -- replace selected text, keep main register -- shortcuts for using + register (system clipboard) vim.keymap.set({ "n", "v" }, "y", [["+y]]) vim.keymap.set("n", "Y", [["+Y]]) vim.keymap.set("n", "D", [["+D]]) vim.keymap.set("n", "p", [["+p]]) -- search-and-replace shortcuts vim.keymap.set("n", "rw", [[:%s/\<\>//gI]]) vim.keymap.set("n", "ra", [[:%s//gc]]) -- toggle expandtab and show message vim.keymap.set("n", "tab", function() ToggleTabsSpaces() end) -- open scratch/tmp buffers which won't prompt for file-save vim.keymap.set("n", "ss", function() TmpBuff("enew") end) vim.keymap.set("n", "sl", function() TmpBuff("vnew") end) vim.keymap.set("n", "sj", function() TmpBuff("new") end) -- quicker switching between panes/splits vim.keymap.set("n", "", [[h]]) vim.keymap.set("n", "", [[j]]) vim.keymap.set("n", "", [[k]]) vim.keymap.set("n", "", [[l]]) kmgAutocmd('FileType', { group = kmGroup, pattern = "netrw", callback = function() vim.keymap.set("n", "", [[h]], { remap = true, buffer = true }) vim.keymap.set("n", "", [[j]], { remap = true, buffer = true }) vim.keymap.set("n", "", [[k]], { remap = true, buffer = true }) vim.keymap.set("n", "", [[l]], { remap = true, buffer = true }) end }) ------------------------------------------------------------------------------------------ -- quickfix and location lists -- ref: :h quickfix or :h location-list -- NOTE: look at :h setqflist and :h vim.diagnostic.setqflist() vim.keymap.set("n", "qo", "copen") vim.keymap.set("n", "qc", "cclose") vim.keymap.set("n", "qn", "cnext") vim.keymap.set("n", "qp", "cprev") vim.keymap.set("n", "ln", "lnext") vim.keymap.set("n", "lp", "lprev") ------------------------------------------------------------------------------------------ -- debugger and debugging ui local dap = require("dap") vim.keymap.set("n", "bc", dap.continue, { desc = "debug: continue" }) vim.keymap.set("n", "bi", dap.step_into, { desc = "debug: step into" }) vim.keymap.set("n", "bo", dap.step_over, { desc = "debug: step over" }) vim.keymap.set("n", "bu", dap.step_out, { desc = "debug: step out" }) vim.keymap.set("n", "blb", dap.list_breakpoints, { desc = "debug: list breakpoints" }) vim.keymap.set("n", "bt", dap.toggle_breakpoint, { desc = "debug: toggle breakpoint" }) vim.keymap.set("n", "bB", function() dap.set_breakpoint(vim.fn.input("breakpoint condition: ")) end, { desc = "debug: set conditional breakpoint" }) vim.keymap.set("n", "bv", function() require("nvim-dap-virtual-text").toggle() end, { desc = "debug: toggle virtual text" }) vim.keymap.set("n", "bq", function() dap.terminate() require("dapui").close() require("nvim-dap-virtual-text").disable() end, { desc = "debug: quit debugger" }) -- TODO: decide if i want these or others, add if so -- vim.keymap.set("n", "zxcv", dap.repl.open, { desc = "open REPL" }) -- vim.keymap.set("n", "zxcv", dap.run_last, { desc = "run last" }) -- vim.keymap.set("n", "zxcv", dap.set_exception_breakpoints({ "all" }), { desc = "set exception breakpoints" }) -- local dapWidgets = require('dap.ui.widgets') -- vim.keymap.set({'n', 'v'}, 'zxcv', dapWidgets.hover) -- vim.keymap.set({'n', 'v'}, 'zxcv', dapWidgets.preview) -- vim.keymap.set('n', 'zxcv', function() dapWidgets.centered_float(dapWidgets.frames) end) -- vim.keymap.set('n', 'zxcv', function() dapWidgets.centered_float(dapWidgets.scopes) end) ------------------------------------------------------------------------------------------ -- lsp kmgAutocmd('LspAttach', { group = kmGroup, callback = function(e) local opts = { buffer = e.buf } vim.keymap.set("n", "gd", function() vim.lsp.buf.definition() end, opts) vim.keymap.set("n", "h", function() vim.lsp.buf.hover() end, opts) vim.keymap.set("i", "", function() vim.lsp.buf.signature_help() end, opts) vim.keymap.set("n", "lv", function() vim.diagnostic.open_float() end, opts) vim.keymap.set("n", "lq", function() vim.diagnostic.setqflist() end, opts) -- TODO: learn what the below commands are and if i want to set keymaps for them -- vim.keymap.set("n", "vws", function() vim.lsp.buf.workspace_symbol() end, opts) -- vim.keymap.set("n", "vca", function() vim.lsp.buf.code_action() end, opts) -- vim.keymap.set("n", "vrl", function() vim.lsp.buf.references() end, opts) -- vim.keymap.set("n", "vrn", function() vim.lsp.buf.rename() end, opts) end }) ------------------------------------------------------------------------------------------ -- git stuff vim.keymap.set("n", "ga", function() vim.cmd("silent !git add %") end) vim.keymap.set("n", "gs", function() TmpBuff("new"); ReadShellCmd('git status') end) vim.keymap.set("n", "gl", function() TmpBuff("vnew"); ReadShellCmd('git log') end) vim.keymap.set("n", "gg", function() TmpBuff() ReadShellCmd('git ' .. vim.fn.input('git ')) end) ------------------------------------------------------------------------------------------ -- plugins -- telescope local tscBuiltin = require('telescope.builtin') local custom_grep_str_w_regex = function() tscBuiltin.grep_string({ search = vim.fn.input("grep > "), use_regex = true, additional_args = "-i", }) end vim.keymap.set('n', 'ft', tscBuiltin.live_grep, { desc = 'tscope find text, live_grep' }) vim.keymap.set('n', 'fT', custom_grep_str_w_regex, { desc = 'tscope find text, static grep w/regex' }) vim.keymap.set('n', 'ff', tscBuiltin.find_files, { desc = 'tscope find files' }) vim.keymap.set('n', 'fg', tscBuiltin.git_files, { desc = 'tscope find git-tracked files' }) vim.keymap.set('n', 'fb', tscBuiltin.buffers, { desc = 'tscope buffers' }) vim.keymap.set('n', 'fh', tscBuiltin.help_tags, { desc = 'tscope help tags' }) -- TODO: maybe add commands: -- - find files including git-ignored (have a yes and no option) -- - grep files including git-ignored (have a yes and no option) -- - grep which supports fuzzy-find, unless performance is horrendous -- harpoon local harpoon = require("harpoon") vim.keymap.set("n", "hl", function() harpoon.ui:toggle_quick_menu(harpoon:list()) end) vim.keymap.set("n", "ha", function() harpoon:list():add() end) vim.keymap.set("n", "hA", function() harpoon:list():prepend() end) vim.keymap.set("n", "hn", function() harpoon:list():next() end) vim.keymap.set("n", "hp", function() harpoon:list():prev() end) for i = 1, 10, 1 do vim.keymap.set("n", "" .. (i % 10), function() harpoon:list():select(i) end) vim.keymap.set("n", "h" .. (i % 10), function() harpoon:list():replace_at(i) end) end -- undotree vim.keymap.set("n", "u", vim.cmd.UndotreeToggle) -- treesitter and treesitter-context vim.keymap.set("n", "tc", function() vim.cmd.TSContext({ "toggle" }) end) -- conform (formatter) vim.keymap.set("n", "fmt", function() require("conform").format({ bufnr = 0 }) end)