--- ~/.config/nvim/lua/mapping.lua --[[ ----------------------------------------------------------------------------- | Commands \ Modes | Normal | Insert | Command | Visual | Select | Operator | |------------------|--------|--------|---------|--------|--------|----------| | map / noremap | @ | - | - | @ | @ | @ | | nmap / nnoremap | @ | - | - | - | - | - | | vmap / vnoremap | - | - | - | @ | @ | - | | omap / onoremap | - | - | - | - | - | @ | | xmap / xnoremap | - | - | - | @ | - | - | | smap / snoremap | - | - | - | - | @ | - | | map! / noremap! | - | @ | @ | - | - | - | | imap / inoremap | - | @ | - | - | - | - | | cmap / cnoremap | - | - | @ | - | - | - | ----------------------------------------------------------------------------- --]] local utils = require "rc.utils" --- Basic mappings {{{ -- Disable Ex-mode, remap to register macros vim.keymap.set("n", "Q", "q") vim.keymap.set("n", "gQ", "@q") -- Disable dangerous/annoying default mappings -- ZZ - Save current file and quit -- ZQ - Quit without checking changes (:q!) vim.keymap.set("n", "ZZ", "") vim.keymap.set("n", "ZQ", "") -- Useless command. M - to middle line of window vim.keymap.set("n", "M", "m") -- Better up/down vim.keymap.set({ "n", "x" }, "j", "v:count == 0 ? 'gj' : 'j'", { desc = "Down", expr = true, silent = true }) vim.keymap.set({ "n", "x" }, "", "v:count == 0 ? 'gj' : 'j'", { desc = "Down", expr = true, silent = true }) vim.keymap.set({ "n", "x" }, "k", "v:count == 0 ? 'gk' : 'k'", { desc = "Up", expr = true, silent = true }) vim.keymap.set({ "n", "x" }, "", "v:count == 0 ? 'gk' : 'k'", { desc = "Up", expr = true, silent = true }) -- Emacs-like cursor move in insert/command mode vim.keymap.set("i", "", "") vim.keymap.set("i", "", "") vim.keymap.set("i", "", "") vim.keymap.set("i", "", "") vim.keymap.set("i", "", "") vim.keymap.set("i", "", "D") -- Enable undo and in insert mode. vim.keymap.set("i", "", "u") vim.keymap.set("i", "", "u") -- Command-line mode key mappings -- : move to head vim.keymap.set("c", "", "") -- : previous char vim.keymap.set("c", "", "") -- : delete char vim.keymap.set("c", "", "") -- : move to end vim.keymap.set("c", "", "") -- : next char vim.keymap.set("c", "", "") -- : next history vim.keymap.set("c", "", "") -- : previous history vim.keymap.set("c", "", "") -- : paste vim.keymap.set("c", "", "*") -- : exit vim.keymap.set("c", "", "") -- : delete to the end vim.keymap.set("c", "", [[repeat("\", strchars(getcmdline()[getcmdpos() - 1:]))]], { expr = true }) -- Indent by > and < instead of >> and << vim.keymap.set("n", ">", ">>") vim.keymap.set("n", "<", "<<") -- Maintain visual mode after shifting > and < vim.keymap.set("x", ">", ">gv") vim.keymap.set("x", "<", "") vim.keymap.set("i", "j ", "j") vim.keymap.set("c", "j", [[getcmdline()[getcmdpos()-2] ==# 'j' ? "\\" : 'j']], { expr = true }) -- Start new line from any cursor position vim.keymap.set("i", "", "o") -- Change current word in a repeatable manner vim.keymap.set("n", "cn", "*``cgn") vim.keymap.set("n", "cN", "*``cgN") -- Change selected word in a repeatable manner vim.keymap.set("v", "cn", [["y/\\V\=escape(@\", '/')\\" . "``cgn"]], { expr = true }) vim.keymap.set("v", "cn", [["y/\\V\=escape(@\", '/')\\" . "``cgN"]], { expr = true }) -- Close windows with q vim.keymap.set("n", "q", [[winnr('$') != 1 ? ':close' : ':bdelete']], { silent = true, expr = true, }) -- Improve the behavior of '0': tobble between '^' and '0' vim.keymap.set( { "n", "x", "o" }, "0", "getline('.')[0 : col('.') - 2] =~# '^\\s\\+$' ? '0' : '^'", { expr = true, desc = "Toggle between '^' and '0'" } ) -- Turn off search highlight vim.keymap.set( { "n", "i" }, "", [[silent! nohlsearch]], { silent = true, desc = "Escape and clear hlsearch" } ) --- }}} -- Window/Tabs operation {{{ vim.keymap.set("n", "wd", "c", { desc = "Delete window" }) vim.keymap.set("n", "ww", "p", { desc = "Other window" }) vim.keymap.set("n", "w-", "s", { desc = "Split window below" }) vim.keymap.set("n", "w|", "v", { desc = "Split window right" }) vim.keymap.set("n", "w=", "v", { desc = "Equal size window" }) -- new tab vim.keymap.set("n", "", "tabnew", { desc = "New Tab" }) vim.keymap.set("n", "]", "tabnext", { desc = "Next Tab" }) vim.keymap.set("n", "[", "tabprevious", { desc = "Previous Tab" }) vim.keymap.set("n", "d", "tabclose", { desc = "Close Tab" }) vim.keymap.set("n", "f", "tabfirst", { desc = "First Tab" }) vim.keymap.set("n", "l", "tablast", { desc = "Last Tab" }) -- Buffer vim.keymap.set("n", "[b", "bprevious", { desc = "Prev Buffer" }) vim.keymap.set("n", "]b", "bnext", { desc = "Next Buffer" }) -- bd -> Snacks.bufdelete() -- bo -> Snacks.bufdelete.other() vim.keymap.set("n", "bD", "bd", { desc = "Delete Buffer and Window" }) --- }}} -- Diagnostic {{{ ---@param count number ---@param severity? lsp.DiagnosticSeverity local diagnostic_goto = function(count, severity) return function() vim.diagnostic.jump { count = count, float = true, severity = severity } end end vim.keymap.set("n", "cd", vim.diagnostic.open_float, { desc = "Line Diagnostics" }) vim.keymap.set("n", "]d", diagnostic_goto(1), { desc = "Next Diagnostic" }) vim.keymap.set("n", "[d", diagnostic_goto(-1), { desc = "Prev Diagnostic" }) vim.keymap.set("n", "]e", diagnostic_goto(1, vim.diagnostic.severity.ERROR), { desc = "Next Error" }) vim.keymap.set("n", "[e", diagnostic_goto(-1, vim.diagnostic.severity.ERROR), { desc = "Next Error" }) vim.keymap.set("n", "]w", diagnostic_goto(1, vim.diagnostic.severity.WARN), { desc = "Next Error" }) vim.keymap.set("n", "[w", diagnostic_goto(-1, vim.diagnostic.severity.WARN), { desc = "Next Error" }) -- }}} --- Toggle Editor UI {{{ if Snacks.config.toggle and Snacks.config.toggle.enabled then local utils_format = require "rc.utils.format" utils_format.snacks_toggle(false):map "uf" utils_format.snacks_toggle(true):map "uF" Snacks.toggle.option("spell", { name = "Spelling" }):map "us" Snacks.toggle.option("wrap", { name = "Wrap" }):map "uw" Snacks.toggle.option("relativenumber", { name = "Relative Number" }):map "uL" Snacks.toggle.diagnostics():map "ud" Snacks.toggle.line_number():map "ul" Snacks.toggle .option("conceallevel", { off = 0, on = vim.o.conceallevel > 0 and vim.o.conceallevel or 2, name = "Conceal Level" }) :map "uc" Snacks.toggle .option("showtabline", { off = 0, on = vim.o.showtabline > 0 and vim.o.showtabline or 2, name = "Tabline" }) :map "uA" Snacks.toggle.treesitter():map "uT" Snacks.toggle.option("background", { off = "light", on = "dark", name = "Dark Background" }):map "ub" Snacks.toggle.dim():map "uD" Snacks.toggle.animate():map "ua" Snacks.toggle.indent():map "ug" Snacks.toggle.scroll():map "uS" Snacks.toggle.profiler():map "dpp" Snacks.toggle.profiler_highlights():map "dph" if vim.lsp.inlay_hint then Snacks.toggle.inlay_hints():map "uh" end else -- toggle diagnostics vim.keymap.set("n", "ud", utils.toggle_diagnostics, { desc = "Toggle Diagnostics" }) -- toggle list char (control characters) vim.keymap.set("n", "uh", function() utils.toggle "list" -- vim.wo.list = not vim.wo.list end, { silent = true, desc = "Toggle list char (control characters)" }) -- toggle line numbers vim.keymap.set("n", "ul", function() -- vim.wo.number = not vim.wo.number -- vim.wo.relativenumber = not vim.wo.relativenumber utils.toggle("relativenumber", true) utils.toggle "number" end, { silent = true, desc = "Toggle Line Numbers" }) -- toggle spell checking vim.keymap.set("n", "us", function() utils.toggle "spell" end, { silent = true, desc = "Toggle Spelling" }) -- toggle wrap vim.keymap.set("n", "uw", function() utils.toggle "wrap" end, { silent = true, desc = "Toggle Word Wrap" }) end --- }}} --- Leader mappings {{{ -- ;; to : -- api.nvim_set_keymap("n", ";", ":", {noremap = true, silent = true}) -- Quit vim.keymap.set("n", "q", ":quit", { silent = true, desc = "Quit" }) vim.keymap.set("v", "q", ":quit", { silent = true, desc = "Quit" }) vim.keymap.set("n", "Q", ":qall!", { silent = true, desc = "Quit all" }) vim.keymap.set("v", "Q", ":qall!", { silent = true, desc = "Quit all" }) -- Fast saving vim.keymap.set("n", "w", "update", { silent = true, desc = "Update file" }) vim.keymap.set("v", "w", ":update", { silent = true, desc = "Update file" }) vim.keymap.set("n", "W", "wall!", { silent = true, desc = "Save all" }) vim.keymap.set("v", "W", ":wall!", { silent = true, desc = "Save all" }) --- }}}