summaryrefslogtreecommitdiff
path: root/lua/lvim/keymappings.lua
diff options
context:
space:
mode:
authorkylo252 <[email protected]>2021-10-10 21:07:41 +0200
committerGitHub <[email protected]>2021-10-10 21:07:41 +0200
commit52b74557415eb757ad4b7481b0aec8a3f98dd58d (patch)
tree9a05ec71a46c99fbdf8df0043be652b528c7c04e /lua/lvim/keymappings.lua
parente2c85df440564a62fd804555747b1652a6844a5e (diff)
feat: add an independent lvim namespace (#1699)
Diffstat (limited to 'lua/lvim/keymappings.lua')
-rw-r--r--lua/lvim/keymappings.lua180
1 files changed, 180 insertions, 0 deletions
diff --git a/lua/lvim/keymappings.lua b/lua/lvim/keymappings.lua
new file mode 100644
index 00000000..68a49393
--- /dev/null
+++ b/lua/lvim/keymappings.lua
@@ -0,0 +1,180 @@
+local M = {}
+local Log = require "lvim.core.log"
+
+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",
+}
+
+-- Append key mappings to lunarvim's defaults for a given mode
+-- @param keymaps The table of key mappings containing a list per mode (normal_mode, insert_mode, ..)
+function M.append_to_defaults(keymaps)
+ for mode, mappings in pairs(keymaps) do
+ for k, v in ipairs(mappings) do
+ lvim.keys[mode][k] = v
+ end
+ 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
+function M.load_mode(mode, keymaps)
+ mode = mode_adapters[mode] and mode_adapters[mode] or mode
+ for k, v in pairs(keymaps) do
+ 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
+function M.load(keymaps)
+ for mode, mapping in pairs(keymaps) do
+ M.load_mode(mode, mapping)
+ end
+end
+
+function M.config()
+ lvim.keys = {
+ ---@usage change or add keymappings for insert mode
+ insert_mode = {
+ -- 'jk' for quitting insert mode
+ ["jk"] = "<ESC>",
+ -- 'kj' for quitting insert mode
+ ["kj"] = "<ESC>",
+ -- 'jj' for quitting insert mode
+ ["jj"] = "<ESC>",
+ -- Move current line / block with Alt-j/k ala vscode.
+ ["<A-j>"] = "<Esc>:m .+1<CR>==gi",
+ -- Move current line / block with Alt-j/k ala vscode.
+ ["<A-k>"] = "<Esc>:m .-2<CR>==gi",
+ -- navigation
+ ["<A-Up>"] = "<C-\\><C-N><C-w>k",
+ ["<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() ? "\\<down>" : "\\<C-j>"', { expr = true, noremap = true } },
+ ["<C-k>"] = { 'pumvisible() ? "\\<up>" : "\\<C-k>"', { expr = true, noremap = true } },
+ },
+
+ ---@usage change or add keymappings for normal mode
+ normal_mode = {
+ -- Better window movement
+ ["<C-h>"] = "<C-w>h",
+ ["<C-j>"] = "<C-w>j",
+ ["<C-k>"] = "<C-w>k",
+ ["<C-l>"] = "<C-w>l",
+
+ -- Resize with arrows
+ ["<C-Up>"] = ":resize -2<CR>",
+ ["<C-Down>"] = ":resize +2<CR>",
+ ["<C-Left>"] = ":vertical resize -2<CR>",
+ ["<C-Right>"] = ":vertical resize +2<CR>",
+
+ -- Tab switch buffer
+ ["<S-l>"] = ":BufferNext<CR>",
+ ["<S-h>"] = ":BufferPrevious<CR>",
+
+ -- Move current line / block with Alt-j/k a la vscode.
+ ["<A-j>"] = ":m .+1<CR>==",
+ ["<A-k>"] = ":m .-2<CR>==",
+
+ -- QuickFix
+ ["]q"] = ":cnext<CR>",
+ ["[q"] = ":cprev<CR>",
+ ["<C-q>"] = ":call QuickFixToggle()<CR>",
+ },
+
+ ---@usage change or add keymappings for terminal mode
+ term_mode = {
+ -- Terminal window navigation
+ ["<C-h>"] = "<C-\\><C-N><C-w>h",
+ ["<C-j>"] = "<C-\\><C-N><C-w>j",
+ ["<C-k>"] = "<C-\\><C-N><C-w>k",
+ ["<C-l>"] = "<C-\\><C-N><C-w>l",
+ },
+
+ ---@usage change or add keymappings for visual mode
+ visual_mode = {
+ -- Better indenting
+ ["<"] = "<gv",
+ [">"] = ">gv",
+
+ -- ["p"] = '"0p',
+ -- ["P"] = '"0P',
+ },
+
+ ---@usage change or add keymappings for visual block mode
+ visual_block_mode = {
+ -- Move selected line / block of text in visual mode
+ ["K"] = ":move '<-2<CR>gv-gv",
+ ["J"] = ":move '>+1<CR>gv-gv",
+
+ -- Move current line / block with Alt-j/k ala vscode.
+ ["<A-j>"] = ":m '>+1<CR>gv-gv",
+ ["<A-k>"] = ":m '<-2<CR>gv-gv",
+ },
+
+ ---@usage change or add keymappings for command mode
+ command_mode = {
+ -- 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 } },
+ },
+ }
+
+ if vim.fn.has "mac" == 1 then
+ lvim.keys.normal_mode["<A-Up>"] = lvim.keys.normal_mode["<C-Up>"]
+ lvim.keys.normal_mode["<A-Down>"] = lvim.keys.normal_mode["<C-Down>"]
+ lvim.keys.normal_mode["<A-Left>"] = lvim.keys.normal_mode["<C-Left>"]
+ lvim.keys.normal_mode["<A-Right>"] = lvim.keys.normal_mode["<C-Right>"]
+ Log:debug "Activated mac keymappings"
+ end
+end
+
+function M.print(mode)
+ print "List of LunarVim's default keymappings (not including which-key)"
+ if mode then
+ print(vim.inspect(lvim.keys[mode]))
+ else
+ print(vim.inspect(lvim.keys))
+ end
+end
+
+function M.setup()
+ vim.g.mapleader = (lvim.leader == "space" and " ") or lvim.leader
+ M.load(lvim.keys)
+end
+
+return M