瀏覽代碼

fix(keymap): unset on reload, load correct order, add unset default (#1942)

fix(keymap): don't unset default keymaps on reload unless set to false

fix(keymaps): prevent accessing undefined default mode

fix(keymap): use unadapted mode for default check

fix(keymap): apply initial lvim.keys
Chase Colman 3 年之前
父節點
當前提交
627fdd6049
共有 2 個文件被更改,包括 31 次插入5 次删除
  1. 7 3
      lua/lvim/config/init.lua
  2. 24 2
      lua/lvim/keymappings.lua

+ 7 - 3
lua/lvim/config/init.lua

@@ -26,15 +26,14 @@ function M:init()
     lvim.database = { save_location = utils.join_paths(home_dir, ".config", "lunarvim_db"), auto_execute = 1 }
   end
 
+  lvim.keys = apply_defaults(lvim.keys, require("lvim.keymappings").get_defaults())
+
   local builtins = require "lvim.core.builtins"
   builtins.config { user_config_file = user_config_file }
 
   local settings = require "lvim.config.settings"
   settings.load_options()
 
-  local default_keymaps = require("lvim.keymappings").get_defaults()
-  lvim.keys = apply_defaults(lvim.keys, default_keymaps)
-
   local autocmds = require "lvim.core.autocmds"
   lvim.autocommands = apply_defaults(lvim.autocommands, autocmds.load_augroups())
 
@@ -89,6 +88,9 @@ function M:load(config_path)
   autocmds.define_augroups(lvim.autocommands)
 
   vim.g.mapleader = (lvim.leader == "space" and " ") or lvim.leader
+
+  local default_keymaps = require("lvim.keymappings").get_defaults()
+  lvim.keys = apply_defaults(lvim.keys, default_keymaps)
   require("lvim.keymappings").load(lvim.keys)
 
   local settings = require "lvim.config.settings"
@@ -98,6 +100,8 @@ end
 --- Override the configuration with a user provided one
 -- @param config_path The path to the configuration overrides
 function M:reload()
+  require("lvim.keymappings").clear(lvim.keys)
+
   local lvim_modules = {}
   for module, _ in pairs(package.loaded) do
     if module:match "lvim.core" then

+ 24 - 2
lua/lvim/keymappings.lua

@@ -24,13 +24,31 @@ local mode_adapters = {
 -- 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)
+  local default = M.get_defaults()
+  lvim.keys = lvim.keys or default
   for mode, mappings in pairs(keymaps) do
-    for k, v in ipairs(mappings) do
+    lvim.keys[mode] = lvim.keys[mode] or default[mode]
+    for k, v in pairs(mappings) do
       lvim.keys[mode][k] = v
     end
   end
 end
 
+-- Unsets all keybindings defined in keymaps
+-- @param keymaps The table of key mappings containing a list per mode (normal_mode, insert_mode, ..)
+function M.clear(keymaps)
+  local default = M.get_defaults()
+  for mode, mappings in pairs(keymaps) do
+    local translated_mode = mode_adapters[mode] and mode_adapters[mode] or mode
+    for key, _ in pairs(mappings) do
+      -- some plugins may override default bindings that the user hasn't manually overriden
+      if default[mode][key] ~= nil or (default[translated_mode] ~= nil and default[translated_mode][key] ~= nil) then
+        pcall(vim.api.nvim_del_keymap, translated_mode, key)
+      end
+    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
@@ -41,7 +59,11 @@ function M.set_keymaps(mode, key, val)
     opt = val[2]
     val = val[1]
   end
-  vim.api.nvim_set_keymap(mode, key, val, opt)
+  if val then
+    vim.api.nvim_set_keymap(mode, key, val, opt)
+  else
+    pcall(vim.api.nvim_del_keymap, mode, key)
+  end
 end
 
 -- Load key mappings for a given mode