Skip to content

Commit 56ae9be

Browse files
committed
fix: protect against re-registering the same keymap for buffer
1 parent cb1a982 commit 56ae9be

File tree

1 file changed

+15
-3
lines changed

1 file changed

+15
-3
lines changed

lua/copilot/keymaps/init.lua

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ local config = require("copilot.config")
44
local M = {}
55
local previous_keymaps = {}
66

7+
local function get_keymap_key(bufnr, mode, key)
8+
return bufnr .. ":" .. mode .. ":" .. key
9+
end
710
---@param mode string
811
---@param key string
912
---@param action function
@@ -26,6 +29,8 @@ function M.register_keymap(mode, key, action, desc, bufnr)
2629
silent = true,
2730
buffer = bufnr,
2831
})
32+
33+
previous_keymaps[get_keymap_key(bufnr, mode, key)] = { type = "none", value = nil }
2934
end
3035

3136
---@param mode string
@@ -43,7 +48,13 @@ function M.register_keymap_with_passthrough(mode, key, action, desc, bufnr)
4348
return
4449
end
4550

46-
local keymap_key = bufnr .. ":" .. mode .. ":" .. key
51+
local keymap_key = get_keymap_key(bufnr, mode, key)
52+
53+
if previous_keymaps[keymap_key] then
54+
logger.trace("Keymap already registered for " .. keymap_key)
55+
return
56+
end
57+
4758
-- Save any existing mapping for this key
4859
local existing = vim.fn.maparg(key, mode, false, true)
4960
if existing then
@@ -54,11 +65,11 @@ function M.register_keymap_with_passthrough(mode, key, action, desc, bufnr)
5465
previous_keymaps[keymap_key] = { type = "callback", value = existing.callback }
5566
logger.trace("Saved existing keymap callback for " .. keymap_key)
5667
else
57-
previous_keymaps[keymap_key] = nil
68+
previous_keymaps[keymap_key] = { type = "none", value = nil }
5869
logger.trace("No existing keymap for " .. keymap_key)
5970
end
6071
else
61-
previous_keymaps[keymap_key] = nil
72+
previous_keymaps[keymap_key] = { type = "none", value = nil }
6273
logger.trace("No existing keymap for " .. keymap_key)
6374
end
6475

@@ -102,6 +113,7 @@ function M.unset_keymap_if_exists(mode, key, bufnr)
102113
end
103114

104115
local ok, err = pcall(vim.api.nvim_buf_del_keymap, bufnr, mode, key)
116+
previous_keymaps[get_keymap_key(bufnr, mode, key)] = nil
105117

106118
if not ok then
107119
local suggestion_keymaps = config.suggestion.keymap or {}

0 commit comments

Comments
 (0)