Skip to content

Commit cef1454

Browse files
committed
perf(keymaps): cache existing buffer maps per mode
1 parent 58f14a5 commit cef1454

1 file changed

Lines changed: 36 additions & 20 deletions

File tree

lua/diffview/vcs/file.lua

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
}
395404
end
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

Comments
 (0)