11local logger = require (" copilot.logger" )
2- local config = require (" copilot.config" )
32
43local M = {}
54local previous_keymaps = {}
65
6+ --- @param bufnr integer
7+ --- @param mode string
8+ --- @param key string
79local function get_keymap_key (bufnr , mode , key )
10+ if not bufnr or not mode or not key then
11+ logger .error (" Invalid parameters to get_keymap_key" .. vim .inspect ({ bufnr , mode , key }))
12+ return " invalid"
13+ end
14+
815 return bufnr .. " :" .. mode .. " :" .. key
916end
1017--- @param mode string
@@ -22,6 +29,12 @@ function M.register_keymap(mode, key, action, desc, bufnr)
2229 return
2330 end
2431
32+ local keymap_key = get_keymap_key (bufnr , mode , key )
33+ if previous_keymaps [keymap_key ] then
34+ logger .trace (" Keymap already registered for " .. keymap_key )
35+ return
36+ end
37+
2538 vim .keymap .set (mode , key , function ()
2639 action ()
2740 end , {
@@ -30,7 +43,7 @@ function M.register_keymap(mode, key, action, desc, bufnr)
3043 buffer = bufnr ,
3144 })
3245
33- previous_keymaps [get_keymap_key ( bufnr , mode , key ) ] = { type = " none" , value = nil }
46+ previous_keymaps [keymap_key ] = { type = " none" , value = nil }
3447end
3548
3649--- @param mode string
@@ -109,33 +122,48 @@ end
109122--- @param key string | false
110123--- @param bufnr integer
111124function M .unset_keymap_if_exists (mode , key , bufnr )
112- if not key then
125+ if not key or not bufnr then
113126 return
114127 end
115128
116129 local ok , err = pcall (vim .api .nvim_buf_del_keymap , bufnr , mode , key )
117130 previous_keymaps [get_keymap_key (bufnr , mode , key )] = nil
118131
119132 if not ok then
120- local suggestion_keymaps = config .suggestion .keymap or {}
121- local nes_keymaps = config .nes .keymap or {}
122- local panel_keymaps = config .panel .keymap or {}
123- local found = false
124-
125- for _ , tbl in ipairs ({ suggestion_keymaps , nes_keymaps , panel_keymaps }) do
126- for _ , v in pairs (tbl ) do
127- if v == key then
128- if found then
129- logger .error (" Keymap " .. key .. " is used for two different actions, please review your configuration." )
130- return
131- else
132- found = true
133- end
134- end
133+ logger .error (" Could not unset keymap for " .. (mode or " nil" ) .. " " .. key .. " , bufnr " .. bufnr .. " : " .. err )
134+ end
135+ end
136+
137+ --- @param config CopilotConfig
138+ function M .validate (config )
139+ local suggestion_keymaps = config .suggestion .keymap or {}
140+ local nes_keymaps = config .nes .keymap or {}
141+ local panel_keymaps = config .panel .keymap or {}
142+ local seen = {}
143+ local duplicates = {}
144+
145+ for _ , cfg in ipairs ({ suggestion_keymaps , nes_keymaps , panel_keymaps }) do
146+ for action , km in pairs (cfg ) do
147+ if not km then
148+ goto continue
149+ end
150+
151+ -- TODO: find a better way to determine mode, this is prone to maintenance bugs
152+ -- TODO: Not sure how to validate keymaps, since some COULD be duplicates and valid
153+ local mode = (action == config .panel .keymap .open or vim .tbl_contains (config .nes .keymap , action )) and " n" or " i"
154+ local keymap_key = get_keymap_key (0 , mode , km )
155+ if seen [keymap_key ] then
156+ duplicates [keymap_key ] = (duplicates [keymap_key ] or 1 ) + 1
157+ else
158+ seen [keymap_key ] = true
135159 end
160+
161+ :: continue::
136162 end
163+ end
137164
138- logger .error (" Could not unset keymap for " .. mode .. " " .. key .. " , bufnr " .. bufnr .. " : " .. err )
165+ for key , count in pairs (duplicates ) do
166+ logger .error (" Duplicate keymap detected: " .. key .. " (" .. count .. " times), please review your configuration." )
139167 end
140168end
141169
0 commit comments