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//g]]) -- toggle expandtab and show message vim.keymap.set("n", "tab", function() if vim.opt.expandtab:get() then vim.opt.expandtab = false print("using actual tabs") else vim.opt.expandtab = true print("using spaces in place of tabs") end 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 TODO: learn about quickfix (:help quickfix), then maybe use these -- vim.keymap.set("n", "", "cnextzz") -- vim.keymap.set("n", "", "cprevzz") -- vim.keymap.set("n", "k", "lnextzz") -- vim.keymap.set("n", "j", "lprevzz") ------------------------------------------------------------------------------------------ -- 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", "K", function() vim.lsp.buf.hover() end, opts) vim.keymap.set("i", "", function() vim.lsp.buf.signature_help() end, opts) vim.keymap.set("n", "vdv", function() vim.diagnostic.open_float() end, opts) vim.keymap.set("n", "vdn", function() vim.diagnostic.goto_next() end, opts) vim.keymap.set("n", "vdp", function() vim.diagnostic.goto_prev() end, opts) 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 }) ------------------------------------------------------------------------------------------ -- 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' }) -- 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) vim.keymap.set("n", "hz", function() harpoon:list():select(1) end) vim.keymap.set("n", "hx", function() harpoon:list():select(2) end) vim.keymap.set("n", "hc", function() harpoon:list():select(3) end) vim.keymap.set("n", "hv", function() harpoon:list():select(4) end) vim.keymap.set("n", "hb", function() harpoon:list():select(5) end) vim.keymap.set("n", "hZ", function() harpoon:list():replace_at(1) end) vim.keymap.set("n", "hX", function() harpoon:list():replace_at(2) end) vim.keymap.set("n", "hC", function() harpoon:list():replace_at(3) end) vim.keymap.set("n", "hV", function() harpoon:list():replace_at(4) end) vim.keymap.set("n", "hB", function() harpoon:list():replace_at(5) 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) -- fugitive (git integration) vim.keymap.set("n", "gG", vim.cmd.Git) vim.keymap.set("n", "gg", ":Git ") -- shortcut, arbitrary git commands vim.keymap.set("n", "ga", function() vim.cmd.Git({ "add %"}) end) vim.keymap.set("n", "gs", function() vim.cmd.Git({ "-p status" }) end) vim.keymap.set("n", "gc", function() vim.cmd.Git({ "commit -a" }) end) -- conform (formatter) vim.keymap.set("n", "fmt", function() require("conform").format({ bufnr = 0 }) end)