@@ -4,6 +4,9 @@ local config = require("copilot.config")
44local M = {}
55local 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 }
2934end
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