local Util = require("utils") vim.g.mapleader = vim.keycode("") vim.g.maplocalleader = vim.keycode("") -- Fix default keymap errors vim.keymap.set("x", "", "") -- Add undo break-points vim.keymap.set("i", ",", ",u") vim.keymap.set("i", ".", ".u") vim.keymap.set("i", ";", ";u") -- Native-like keymaps -- keymaps that follows native keymap and make it more consistent vim.keymap.set("n", "-", "e %:h", { desc = "open dir" }) -- Breaking remaps on native keymaps vim.keymap.set("n", "g/", "gcc", { remap = true }) vim.keymap.set("x", "g/", "gc", { remap = true }) vim.keymap.set("n", "Q", "q") vim.keymap.set("n", "q", "close") -- -- fast indent/dedenting -- vim.keymap.set("n", "<", "<<") -- vim.keymap.set("x", "<", "", ">>") -- vim.keymap.set("x", ">", ">gv") -- quickfix list vim.keymap.set("n", "", "cnext") vim.keymap.set("n", "", "cprev") vim.keymap.set("n", "", function() local wininfos = vim.fn.getwininfo() local is_quickfix_open = vim.iter(wininfos):any(function(info) return info.quickfix == 1 and info.loclist ~= 1 end) if is_quickfix_open then vim.cmd.cclose() else vim.cmd.copen() end end) vim.keymap.set("n", "", "tabprev", { desc = "Prev tab" }) vim.keymap.set("n", "", "tabnext", { desc = "Next tab" }) -- ways to exit select mode without substituting vim.keymap.set("s", "", "I") vim.keymap.set("s", "", "A") -- other useful mappings vim.keymap.set("x", "J", ":m '>+1gv", { silent = true, desc = "Move down" }) vim.keymap.set("x", "K", ":m '<-2gv", { silent = true, desc = "Move up" }) -- credit: https://www.reddit.com/r/neovim/comments/1k4efz8/comment/mo9t5xq vim.keymap.set("n", "ycc", function() return 'yy' .. vim.v.count1 .. "gcc']p" end, { remap = true, expr = true }) -- TODO: make it work with v:count vim.keymap.set("n", "zh", "shiftwidth() . 'zh'", { expr = true }) vim.keymap.set("n", "zl", "shiftwidth() . 'zl'", { expr = true }) -- easy register mappings vim.keymap.set("n", "+", '"+') vim.keymap.set("n", "_", '"_') -- diagnostics vim.keymap.set("n", "cd", vim.diagnostic.open_float, { desc = "Line Diagnostics" }) -- stylua: ignore start vim.keymap.set({ "n", "x" }, "]d", function() vim.diagnostic.jump({ count = 1, float = true }) end, { desc = "Next Diagnostic" }) vim.keymap.set({ "n", "x" }, "[d", function() vim.diagnostic.jump({ count = -1, float = true }) end, { desc = "Prev Diagnostic" }) vim.keymap.set({ "n", "x" }, "]e", function() vim.diagnostic.jump({ count = 1, float = true, severity = vim.diagnostic.severity.ERROR }) end, { desc = "Next Error" }) vim.keymap.set({ "n", "x" }, "[e", function() vim.diagnostic.jump({ count = -1, float = true, severity = vim.diagnostic.severity.ERROR }) end, { desc = "Prev Error" }) vim.keymap.set({ "n", "x" }, "]w", function() vim.diagnostic.jump({ count = 1, float = true, severity = vim.diagnostic.severity.WARN }) end, { desc = "Next Warning" }) vim.keymap.set({ "n", "x" }, "[w", function() vim.diagnostic.jump({ count = -1, float = true, severity = vim.diagnostic.severity.WARN }) end, { desc = "Prev Warning" }) -- stylua: ignore end -- format vim.keymap.set("n", "cf", "Format", { desc = "Format" }) -- snippets vim.keymap.set({ "i", "s" }, "", function() return vim.snippet.active({ direction = 1 }) and vim.snippet.jump(1) end, { silent = true }) vim.keymap.set({ "i", "s" }, "", function() return vim.snippet.active({ direction = -1 }) and vim.snippet.jump(-1) end, { silent = true }) vim.keymap.set({ "i", "s" }, "", function() return vim.snippet.active({ direction = 1 }) and vim.snippet.jump(1) end, { silent = true }) vim.keymap.set({ "i", "s" }, "", function() return vim.snippet.active({ direction = -1 }) and vim.snippet.jump(-1) end, { silent = true }) -- lsp vim.api.nvim_create_autocmd("LspAttach", { group = vim.api.nvim_create_augroup("UserLspAttach", { clear = false }), callback = function(ev) vim.keymap.set("n", "grr", vim.lsp.buf.references, { buffer = ev.buf }) vim.keymap.set("n", "gd", vim.lsp.buf.definition, { buffer = ev.buf }) vim.keymap.set("n", "gry", vim.lsp.buf.type_definition, { buffer = ev.buf }) vim.keymap.set("n", "gri", vim.lsp.buf.implementation, { buffer = ev.buf }) vim.keymap.set("n", "grd", vim.lsp.buf.declaration, { buffer = ev.buf }) vim.keymap.set("i", "", vim.lsp.buf.signature_help, { buffer = ev.buf }) vim.keymap.set({ "n", "i" }, "", function() vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled()) end, { buffer = ev.buf }) end, }) vim.api.nvim_create_autocmd("User", { pattern = "GitAttach", callback = function(ev) vim.keymap.set({ "x", "o" }, "ih", ":Gitsigns select_hunk", { desc = "Select Hunk", buffer = ev.buf }) vim.keymap.set({ "x", "o" }, "ah", ":Gitsigns select_hunk", { desc = "Select Hunk", buffer = ev.buf }) vim.keymap.set({ "n", "x" }, "]h", "Gitsigns next_hunk", { desc = "Next Hunk", buffer = ev.buf }) vim.keymap.set({ "n", "x" }, "[h", "Gitsigns prev_hunk", { desc = "Prev Hunk", buffer = ev.buf }) vim.keymap.set("n", "gu", "Gitsigns undo_stage_hunk", { desc = "Undo Stage Hunk", buffer = ev.buf }) vim.keymap.set("n", "gA", "Gitsigns stage_buffer", { desc = "Stage Buffer", buffer = ev.buf }) vim.keymap.set("n", "gb", "Gitsigns blame_line", { desc = "Stage Buffer", buffer = ev.buf }) vim.keymap.set("n", "gR", "Gitsigns reset_buffer", { desc = "Reset Buffer", buffer = ev.buf }) vim.keymap.set("n", "gp", "Gitsigns preview_hunk_inline", { desc = "Preview Inline", buffer = ev.buf }) vim.keymap.set("n", "gP", "Gitsigns preview_hunk", { desc = "Preview Hunk", buffer = ev.buf }) vim.keymap.set("n", "gk", "Gitsigns blame_line", { desc = "Blame Line", buffer = ev.buf }) vim.keymap.set({ "n", "x" }, "ga", "Gitsigns stage_hunk", { desc = "Stage Hunk", buffer = ev.buf }) vim.keymap.set({ "n", "x" }, "gr", "Gitsigns reset_hunk", { desc = "Reset Hunk", buffer = ev.buf }) end, })