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 selected lines up or down vim.keymap.set("v", "J", ":m '>+1gv") vim.keymap.set("v", "K", ":m '<-2gv") -- vertically center cursor with half-page jumps vim.keymap.set("n", "", "zz") vim.keymap.set("n", "", "zz") -- 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", "ma=ap'a") -- 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]]) ------------------------------------------------------------------------------------------ -- 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") ------------------------------------------------------------------------------------------ -- 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 builtin = require('telescope.builtin') local custom_tscope_grep = function() builtin.grep_string({ search = vim.fn.input("grep > ")}) end vim.keymap.set('n', 'ft', builtin.live_grep, { desc = 'Telescope find text (live_grep)' }) vim.keymap.set('n', 'fT', custom_tscope_grep, { desc = 'Telescope find text (grep_string)' }) vim.keymap.set('n', 'fg', builtin.git_files, { desc = 'Telescope find git-tracked files' }) vim.keymap.set('n', 'ff', builtin.find_files, { desc = 'Telescope find files' }) vim.keymap.set('n', 'fb', builtin.buffers, { desc = 'Telescope buffers' }) vim.keymap.set('n', 'fh', builtin.help_tags, { desc = 'Telescope 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", "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) -- 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)