@@ -15,6 +15,9 @@ local pl = lazy.access(utils, "path") ---@type PathLib
1515local api = vim .api
1616local M = {}
1717
18+ -- keymaps to restore
19+ local R = {}
20+
1821local HAS_NVIM_0_10 = vim .fn .has (" nvim-0.10" ) == 1
1922
2023--- @alias git.FileDataProducer fun ( kind : vcs.FileKind , path : string , pos : " left" | " right" ): string[]
@@ -350,8 +353,53 @@ function File:attach_buffer(force, opt)
350353 state .keymaps = config .extend_keymaps (conf .keymaps .view , state .keymaps )
351354 local default_map_opt = { silent = true , nowait = true , buffer = self .bufnr }
352355
356+ R = {}
357+
353358 for _ , mapping in ipairs (state .keymaps ) do
354359 local map_opt = vim .tbl_extend (" force" , default_map_opt , mapping [4 ] or {}, { buffer = self .bufnr })
360+
361+ local mode = mapping [1 ] -- string
362+ local name_lhs = mapping [2 ] -- string
363+
364+ local lhs_pat = string.format (" %s" , name_lhs )
365+ -- escape special characters for search pattern
366+ lhs_pat = string.gsub (lhs_pat , " %[" , " %%%[" )
367+ lhs_pat = string.gsub (lhs_pat , " %]" , " %%%]" )
368+
369+ local buf_mappings = api .nvim_buf_get_keymap (self .bufnr , mode )
370+
371+ for _ , buf_km in pairs (buf_mappings ) do
372+ if buf_km .lhs ~= nil then
373+ local result = string.find (buf_km .lhs , lhs_pat )
374+
375+ if result ~= nil then
376+ local rhs = " "
377+ if buf_km .rhs ~= nil then
378+ rhs = buf_km .rhs
379+ else
380+ rhs = buf_km .callback
381+ end
382+ -- save original buffer keymap
383+ local orig_km = {
384+ mode = mode ,
385+ lhs = name_lhs ,
386+ rhs = rhs ,
387+ opts = {
388+ buffer = self .bufnr ,
389+ desc = buf_km .desc ,
390+ silent = buf_km .silent ,
391+ noremap = buf_km .noremap ,
392+ },
393+ }
394+ table.insert (R , orig_km )
395+ -- found buffer keymap, so stop searching
396+ do
397+ break
398+ end
399+ end
400+ end
401+ end
402+
355403 vim .keymap .set (mapping [1 ], mapping [2 ], mapping [3 ], map_opt )
356404 end
357405
@@ -387,6 +435,13 @@ function File:detach_buffer()
387435 end
388436 end
389437
438+ -- restore original buffer keymaps
439+ for _ , km in pairs (R ) do
440+ if km .opts .buffer == self .bufnr then
441+ vim .keymap .set (km .mode , km .lhs , km .rhs , km .opts )
442+ end
443+ end
444+
390445 -- Diagnostics
391446 if state .disable_diagnostics then
392447 if HAS_NVIM_0_10 then
0 commit comments