summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--lua/keymappings.lua49
2 files changed, 32 insertions, 19 deletions
diff --git a/README.md b/README.md
index b68174b9..d7b0ec99 100644
--- a/README.md
+++ b/README.md
@@ -86,6 +86,8 @@ lvim.keys.normal_mode["<C-s>"] = ":w<cr>"
-- lvim.keys.normal_mode["<C-Up>"] = ""
-- edit a default keymapping
-- lvim.keys.normal_mode["<C-q>"] = ":q<cr>"
+-- set keymap with custom opts
+-- lvim.keys.insert_mode["po"] = {'<ESC>', { noremap = true }}
-- Use which-key to add extra bindings with the leader-key prefix
-- lvim.builtin.which_key.mappings["P"] = { "<cmd>lua require'telescope'.extensions.project.project{}<CR>", "Projects" }
diff --git a/lua/keymappings.lua b/lua/keymappings.lua
index 038ebed4..d14bedad 100644
--- a/lua/keymappings.lua
+++ b/lua/keymappings.lua
@@ -2,6 +2,14 @@ local M = {}
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,
+ term_mode = { silent = true },
+}
+
local mode_adapters = {
insert_mode = "i",
normal_mode = "n",
@@ -20,23 +28,34 @@ function M.append_to_defaults(keymaps)
end
end
+-- Set key mappings individually
+-- @param mode The keymap mode, can be one of the keys of mode_adapters
+-- @param key The key of keymap
+-- @param val Can be form as a mapping or tuple of mapping and user defined opt
+function M.set_keymaps(mode, key, val)
+ local opt = generic_opts[mode] and generic_opts[mode] or generic_opts_any
+ if type(val) == "table" then
+ opt = val[2]
+ val = val[1]
+ end
+ vim.api.nvim_set_keymap(mode, key, val, opt)
+end
+
-- Load key mappings for a given mode
-- @param mode The keymap mode, can be one of the keys of mode_adapters
-- @param keymaps The list of key mappings
--- @param opts The mapping options
-function M.load_mode(mode, keymaps, opts)
+function M.load_mode(mode, keymaps)
mode = mode_adapters[mode] and mode_adapters[mode] or mode
for k, v in pairs(keymaps) do
- vim.api.nvim_set_keymap(mode, k, v, opts)
+ M.set_keymaps(mode, k, v)
end
end
-- Load key mappings for all provided modes
-- @param keymaps A list of key mappings for each mode
--- @param opts The mapping options for each mode
-function M.load(keymaps, opts)
+function M.load(keymaps)
for mode, mapping in pairs(keymaps) do
- M.load_mode(mode, mapping, opts[mode])
+ M.load_mode(mode, mapping)
end
end
@@ -59,6 +78,10 @@ function M.config()
["<A-Down>"] = "<C-\\><C-N><C-w>j",
["<A-Left>"] = "<C-\\><C-N><C-w>h",
["<A-Right>"] = "<C-\\><C-N><C-w>l",
+ -- navigate tab completion with <c-j> and <c-k>
+ -- runs conditionally
+ ["<C-j>"] = { 'pumvisible() ? "\\<C-n>" : "\\<C-j>"', { expr = true, noremap = true } },
+ ["<C-k>"] = { 'pumvisible() ? "\\<C-p>" : "\\<C-k>"', { expr = true, noremap = true } },
},
---@usage change or add keymappings for normal mode
@@ -138,20 +161,8 @@ function M.print(mode)
end
function M.setup()
- -- navigate tab completion with <c-j> and <c-k>
- -- runs conditionally
- vim.cmd 'inoremap <expr> <C-j> pumvisible() ? "\\<C-n>" : "\\<C-j>"'
- vim.cmd 'inoremap <expr> <C-k> pumvisible() ? "\\<C-p>" : "\\<C-k>"'
- local generic_opts = {
- insert_mode = generic_opts_any,
- normal_mode = generic_opts_any,
- visual_mode = generic_opts_any,
- visual_block_mode = generic_opts_any,
- term_mode = { silent = true },
- }
-
vim.g.mapleader = (lvim.leader == "space" and " ") or lvim.leader
- M.load(lvim.keys, generic_opts)
+ M.load(lvim.keys)
end
return M