@@ -366,32 +366,41 @@ end
366366--- diffview overwrites it, so we can restore it on detach.
367367--- @param bufnr integer
368368--- @param saved table<string , table>
369+ --- @param mode_map_cache table<string , table>
369370--- @param mode string
370371--- @param lhs string
371- local function save_existing_keymap (bufnr , saved , mode , lhs )
372+ local function save_existing_keymap (bufnr , saved , mode_map_cache , mode , lhs )
372373 local key = mode .. " " .. lhs
373374 if saved [key ] then return end
374375
375- local buf_maps = api .nvim_buf_get_keymap (bufnr , mode )
376- for _ , km in ipairs (buf_maps ) do
377- if km .lhs == lhs then
378- saved [key ] = {
379- mode = mode ,
380- lhs = lhs ,
381- rhs = km .rhs or " " ,
382- callback = km .callback ,
383- opts = {
384- buffer = bufnr ,
385- desc = km .desc ,
386- silent = km .silent == 1 or km .silent == true ,
387- noremap = km .noremap == 1 or km .noremap == true ,
388- nowait = km .nowait == 1 or km .nowait == true ,
389- expr = km .expr == 1 or km .expr == true ,
390- },
391- }
392- return
376+ local mode_cache = mode_map_cache [mode ]
377+ if not mode_cache then
378+ mode_cache = {}
379+ for _ , km in ipairs (api .nvim_buf_get_keymap (bufnr , mode )) do
380+ if km .lhs and mode_cache [km .lhs ] == nil then
381+ mode_cache [km .lhs ] = km
382+ end
393383 end
384+ mode_map_cache [mode ] = mode_cache
394385 end
386+
387+ local km = mode_cache [lhs ]
388+ if not km then return end
389+
390+ saved [key ] = {
391+ mode = mode ,
392+ lhs = lhs ,
393+ rhs = km .rhs or " " ,
394+ callback = km .callback ,
395+ opts = {
396+ buffer = bufnr ,
397+ desc = km .desc ,
398+ silent = km .silent == 1 or km .silent == true ,
399+ noremap = km .noremap == 1 or km .noremap == true ,
400+ nowait = km .nowait == 1 or km .nowait == true ,
401+ expr = km .expr == 1 or km .expr == true ,
402+ },
403+ }
395404end
396405
397406--- @param force ? boolean
@@ -413,11 +422,18 @@ function File:attach_buffer(force, opt)
413422 state .keymaps = config .extend_keymaps (conf .keymaps .view , state .keymaps )
414423 state .saved_keymaps = state .saved_keymaps or {}
415424 local default_map_opt = { silent = true , nowait = true , buffer = self .bufnr }
425+ local existing_maps_by_mode = {}
416426
417427 for _ , mapping in ipairs (state .keymaps ) do
418428 local modes = type (mapping [1 ]) == " table" and mapping [1 ] or { mapping [1 ] }
419429 for _ , mode in ipairs (modes ) do
420- save_existing_keymap (self .bufnr , state .saved_keymaps , mode , mapping [2 ])
430+ save_existing_keymap (
431+ self .bufnr ,
432+ state .saved_keymaps ,
433+ existing_maps_by_mode ,
434+ mode ,
435+ mapping [2 ]
436+ )
421437 end
422438 local map_opt = vim .tbl_extend (" force" , default_map_opt , mapping [4 ] or {}, { buffer = self .bufnr })
423439 vim .keymap .set (mapping [1 ], mapping [2 ], mapping [3 ], map_opt )
0 commit comments