local generic_opts_any = { noremap = true, silent = true } local generic_opts = { insert_mode = generic_opts_any, normal_mode = generic_opts_any, visual_mode = generic_opts_any, visual_block_mode = generic_opts_any, command_mode = generic_opts_any, term_mode = { silent = true }, } local mode_adapters = { insert_mode = "i", normal_mode = "n", term_mode = "t", visual_mode = "v", visual_block_mode = "x", command_mode = "c", } ---@class Keys ---@field insert_mode table ---@field normal_mode table ---@field terminal_mode table ---@field visual_mode table ---@field visual_block_mode table ---@field command_mode table local defaults = { insert_mode = { -- Move current line / block with Alt-j/k ala vscode. [""] = ":m .+1==gi", -- Move current line / block with Alt-j/k ala vscode. [""] = ":m .-2==gi", -- navigation [""] = "k", [""] = "j", [""] = "h", [""] = "l", }, normal_mode = { -- Better window movement [""] = "h", [""] = "j", [""] = "k", [""] = "l", -- Resize with arrows [""] = ":resize -2", [""] = ":resize +2", [""] = ":vertical resize -2", [""] = ":vertical resize +2", -- Move current line / block with Alt-j/k a la vscode. [""] = ":m .+1==", [""] = ":m .-2==", -- QuickFix ["]q"] = ":cnext", ["[q"] = ":cprev", [""] = ":call QuickFixToggle()", }, term_mode = { -- Terminal window navigation [""] = "h", [""] = "j", [""] = "k", [""] = "l", }, visual_mode = { -- Better indenting ["<"] = ""] = ">gv", -- ["p"] = '"0p', -- ["P"] = '"0P', }, visual_block_mode = { -- Move current line / block with Alt-j/k ala vscode. [""] = ":m '>+1gv-gv", [""] = ":m '<-2gv-gv", }, command_mode = { -- navigate tab completion with and -- runs conditionally [""] = { 'pumvisible() ? "\\" : "\\"', { expr = true, noremap = true } }, [""] = { 'pumvisible() ? "\\" : "\\"', { expr = true, noremap = true } }, }, } if vim.fn.has "mac" == 1 then defaults.normal_mode[""] = defaults.normal_mode[""] defaults.normal_mode[""] = defaults.normal_mode[""] defaults.normal_mode[""] = defaults.normal_mode[""] defaults.normal_mode[""] = defaults.normal_mode[""] Log:debug "Activated mac keymappings" end function set_keymaps(mode, key, val) local opt = generic_opts[mode] or generic_opts_any if type(val) == "table" then opt = val[2] val = val[1] end if val then vim.keymap.set(mode, key, val, opt) else pcall(vim.api.nvim_del_keymap, mode, key) end end function load_mode(mode, keymaps) mode = mode_adapters[mode] or mode for k, v in pairs(keymaps) do set_keymaps(mode, k, v) end end function load(keymaps) keymaps = keymaps or {} for mode, mapping in pairs(keymaps) do load_mode(mode, mapping) end end function load_defaults() load(get_defaults()) keys = keys or {} for idx, _ in pairs(defaults) do if not keys[idx] then keys[idx] = {} end end end function get_defaults() return defaults end load_defaults()