--[[ Keymappings for nvim experience. I use combination of both nvim default vim.api.nvim_set_keymap and WhichKey register. Slowly migrating to the WhichKey system, and tweaking the groupings as I go. --]] local key = vim.api.nvim_set_keymap local remap = { noremap = true, silent = true } local wk = require("which-key") -- ╭──────────────────────────────────────────────────────────╮ -- │ Register keybindings │ -- ╰──────────────────────────────────────────────────────────╯ -- Register in all modes, prefix wk.register({ b = { name = "Buffer", n = { "tabnew", "New tab", }, c = { name = "Comments", b = { "lua require('comment-box').lbox()", "Left aligned fixed size box with left aligned text", }, c = { "lua require('comment-box').ccbox()", desc = "Centered adapted box with centered text", }, l = { "lua require('comment-box').cline()", desc = "Centered line", }, }, d = { name = "Delete buffers", h = { "lua require('close_buffers').delete({type = 'hidden'})", "Delete hidden buffers", }, }, g = { name = "Goto buffer", ["1"] = { "buffer! 1", "Buffer 1" }, ["2"] = { "buffer! 2", "Buffer 2" }, ["3"] = { "buffer! 3", "Buffer 3" }, ["4"] = { "buffer! 4", "Buffer 4" }, ["5"] = { "buffer! 5", "Buffer 5" }, ["6"] = { "buffer! 6", "Buffer 6" }, ["7"] = { "buffer! 7", "Buffer 7" }, ["8"] = { "buffer! 8", "Buffer 8" }, ["9"] = { "buffer! 9", "Buffer 9" }, }, }, D = { name = "[D]iagnostics (Trouble)", t = { ":TroubleToggle", "[D]iagnostics [t]oggle" }, -- Quick navigation between diagonostics. f = { ":lua vim.diagnostic.open_float()", "[D]iagnostics: Open [f]loat" }, n = { ":lua vim.diagnostic.goto_next()", "[D]iagnostics: [n]ext" }, p = { ":lua vim.diagnostic.goto_prev()", "[D]iagnostics: [p]rev" }, }, e = { function() vim.cmd("Neotree focus source=filesystem position=left") end, "Toggle the sidebar tree of the root folder.", }, f = { name = "[f]ind", -- Find recursively files across the root folder subfiles. f = { ':lua require("telescope.builtin").find_files()', "[f]ind [f]iles" }, -- Find recursively a text across the root folder subfiles. g = { ':lua require("telescope.builtin").live_grep()', "[f]ind text with [g]rep" }, }, h = { name = "[h]arpoon", a = { "lua require('harpoon.mark').add_file()", "[h]arpoon: [A]dd file" }, r = { "lua require('harpoon.mark').rm_file()", "[h]arpoon: [r]emove file" }, m = { "lua require('harpoon.ui').toggle_quick_menu()", "[h]arpoon: harpoon [m]enu" }, n = { "lua require('harpoon.ui').nav_next()", "[h]arpoon: [n]ext file" }, p = { "lua require('harpoon.ui').nav_prev()", "[h]arpoon: [p]revious file" }, ["1"] = { " lua require('harpoon.ui').nav_file(1)", "[h]arpoon: file 1" }, ["2"] = { " lua require('harpoon.ui').nav_file(2)", "[h]arpoon: file 2" }, ["3"] = { " lua require('harpoon.ui').nav_file(3)", "[h]arpoon: file 3" }, }, --- Remap debugging to "H" from LV default of "h" H = { name = "[H]elp/Conceal/Telescope", c = { name = "[c]onceal", h = { ":set conceallevel=1", "hide/conceal" }, s = { ":set conceallevel=0", "show/unconceal" }, }, t = { name = "Treesitter", t = { vim.treesitter.inspect_tree, "show tree" }, c = { ":=vim.treesitter.get_captures_at_cursor()", "show capture" }, n = { ":=vim.treesitter.get_node():type()", "show node" }, }, }, p = { name = "[p]lugins", i = { function() require("lazy").install() end, "[p]lugins [i]nstall" }, s = { function() require("lazy").home() end, "[p]lugins [s]tatus" }, S = { function() require("lazy").sync() end, "[p]lugins [S]ync" }, u = { function() require("lazy").check() end, "[p]lugins Check [u]pdates" }, U = { function() require("lazy").update() end, "[p]lugins [U]pdate" }, }, q = { name = "[q]uit", q = { ":qa", "[q]uit: [q]uit all" }, f = { ":qa!", "[q]uit: all with [f]orce" }, }, t = { name = "[t]elescope", -- Find recursively TODOs, NOTEs, FIXITs, ... across the root folder subfiles. t = { ":TodoTelescope", "[t]elescope: [t]odo" }, }, x = { ":Bdelete", "[x]: Close current buffer" }, }, { prefix = "" }) -- ╭──────────────────────────────────────────────────────────╮ -- │ Normal mode, prefix │ -- ╰──────────────────────────────────────────────────────────╯ wk.register({ b = { name = "Buffer" }, }, { mode = "n", prefix = "" }) -- ╭──────────────────────────────────────────────────────────╮ -- │ Insert mode, prefix │ -- ╰──────────────────────────────────────────────────────────╯ wk.register({ b = { name = "Buffer" }, }, { mode = "i", prefix = "" }) -- ╭──────────────────────────────────────────────────────────╮ -- │ Insert mode, no prefix │ -- ╰──────────────────────────────────────────────────────────╯ wk.register({ [""] = { "w", "Save file" }, [""] = { "", "Do just Home on CTRL + Home" }, }, { mode = "i", prefix = "" }) -- ╭──────────────────────────────────────────────────────────╮ -- │ All modes, no prefix │ -- ╰──────────────────────────────────────────────────────────╯ wk.register({ [""] = { "w", "Save file" }, [""] = { "", "Do just End on CTRL + End" }, }, { prefix = "" }) -- Go to the next block. --key('n', '', 'g%', remap ) -- Loop through brackets blocks. --key('n', '', 'z%', remap ) -- Highlight the word after pressing enter. key( "n", "", [[:let searchTerm = '\v<'.expand("").'>' let @/ = searchTerm echo '/'.@/ call histadd("search", searchTerm) set hls]], remap ) -- Highlight the visual selection after pressing enter. key( "v", "", [["*y:silent! let searchTerm = '\V'.substitute(escape(@*, '\/'), "\n", '\\n', "g") let @/ = searchTerm echo '/'.@/ call histadd("search", searchTerm) set hls]], remap ) -- Toggle highlight of search key("n", "", ":set hlsearch!", remap) -- Try to correct the current word. key("i", "", "ea", remap) -- Toggle built-in nvim spell checking. key("n", "", ":setlocal spell!", remap) -- Move lines normally like an IDE when line wraps key("i", "", [[v:count ? 'j' : 'gj']], { expr = true, noremap = true, silent = true }) key("i", "", [[v:count ? 'k' : 'gk']], { expr = true, noremap = true, silent = true }) key("n", "", [[v:count ? 'j' : 'gj']], { expr = true, noremap = true, silent = true }) key("n", "", [[v:count ? 'k' : 'gk']], { expr = true, noremap = true, silent = true }) -- Set 'CTRL + v' as 'paster' -- key('', '', 'map"_di', remap ) key("v", "", "p", remap) -- Set 'CTRL + x' as 'cut' key("v", "", "mad`ai", { silent = true }) -- Set 'CTRL + c' as 'copier' key("v", "", "may`ai", remap) key("i", "", ":Registers", remap) -- Create mark. key("n", "'", "`", remap) -- Move normaly bottom and up with C+Up and C+Down. key("i", "", "gk", remap) key("i", "", "gj", remap) key("n", "", "gk", remap) key("n", "", "gj", remap) -- Set 'CTRL + z' as 'undo' key("i", "", "ui", remap) -- Set 'CTRL + y' as 'redo' key("i", "", "", remap) -- Set 'SHIFT + arrows' as 'select' like modern text-editor. key("n", "", "v", remap) key("n", "", "v", remap) key("n", "", "v", remap) key("n", "", "v", remap) key("v", "", "", remap) key("v", "", "", remap) key("v", "", "", remap) key("v", "", "", remap) key("i", "", "v", remap) key("i", "", "v", remap) key("i", "", "v", remap) key("i", "", "v", remap) -- Set 'SHIFT + special-keys' as 'select' like a modern text editor. key("i", "", "v", remap) key("i", "", "v", remap) key("n", "", "v", remap) key("n", "", "v", remap) key("n", "", "", remap) key("n", "", ":call Visual_Scroll_Down()i", remap) -- Indent the current visual selection. key("v", "<", "", ">gv", remap) -- Set 'Backspace' as 'delete selection' for the visual selection. key("v", "", '"_di', remap)