@@ -332,30 +332,59 @@ local function pmap(mode, lhs, cb, opts)
332332 end , opts )
333333end
334334
335+ local blame_bufname_prefix = ' gitsigns-blame:'
336+
337+ --- @alias blme_bufname string the buffer name of the blame buffer
338+ --- @alias blm_win integer the win id of the blame window
339+ ---
340+ --- @type table<blme_bufname , blm_win>
341+ local buf_name_to_blame_map = {}
342+
343+ local function is_blame_window_open_for_buffer (blm_bufname , current_bufname )
344+ local blmwin = buf_name_to_blame_map [blm_bufname ]
345+ if blmwin then
346+ api .nvim_win_close (blmwin , true )
347+ return true
348+ end
349+ end
350+
335351--- @async
336352function M .blame ()
337353 local __FUNC__ = ' blame'
338354 local bufnr = api .nvim_get_current_buf ()
339355 local win = api .nvim_get_current_win ()
340356 local bcache = cache [bufnr ]
341357 if not bcache then
358+ local current_bufname = vim .api .nvim_buf_get_name (bufnr )
359+ if vim .startswith (current_bufname , blame_bufname_prefix ) then
360+ api .nvim_win_close (0 , true )
361+ return
362+ end
342363 log .dprint (' Not attached' )
343364 return
344365 end
345366
346367 bcache :get_blame ()
347368 local blame = assert (bcache .blame )
348369
370+ blm_bufname = (bcache :get_rev_bufname ():gsub (' ^gitsigns:' , blame_bufname_prefix ))
371+ if is_blame_window_open_for_buffer (blm_bufname ) then
372+ return
373+ end
374+
349375 -- Save position to align 'scrollbind'
350376 local top = vim .fn .line (' w0' ) + vim .wo .scrolloff
351377 local current = vim .fn .line (' .' )
352378
353379 vim .cmd .vsplit ({ mods = { keepalt = true , split = ' aboveleft' } })
354380 local blm_win = api .nvim_get_current_win ()
355381
382+ buf_name_to_blame_map [blm_bufname ] = blm_win
383+
356384 local blm_bufnr = api .nvim_create_buf (false , true )
357385 api .nvim_win_set_buf (blm_win , blm_bufnr )
358- api .nvim_buf_set_name (blm_bufnr , (bcache :get_rev_bufname ():gsub (' ^gitsigns:' , ' gitsigns-blame:' )))
386+
387+ api .nvim_buf_set_name (blm_bufnr , blm_bufname )
359388
360389 local revision = bcache .git_obj .revision
361390
@@ -480,6 +509,7 @@ function M.blame()
480509 if api .nvim_win_is_valid (win ) then
481510 cur_wlo .foldenable , cur_wlo .scrollbind , cur_wlo .wrap = unpack (cur_orig_wlo )
482511 end
512+ buf_name_to_blame_map [blm_bufname ] = nil
483513 end ,
484514 })
485515
0 commit comments