diff options
author | Dery Rahman Ahaddienata <[email protected]> | 2021-08-03 12:04:51 +0700 |
---|---|---|
committer | GitHub <[email protected]> | 2021-08-03 01:04:51 -0400 |
commit | 21419b244c40350ee09ef3a5cf6b1ad19054b23f (patch) | |
tree | 39112fa15d9466c5b5f7591813b4635a76f1e1aa | |
parent | dc3b47b7e7d015a8f47c5dae5d50e4d50f9e1cfb (diff) |
Keymapping custom opts (#1215)
-rw-r--r-- | README.md | 2 | ||||
-rw-r--r-- | lua/keymappings.lua | 49 |
2 files changed, 32 insertions, 19 deletions
@@ -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 |