Skip to content

Commit 1e5f846

Browse files
committed
feat(blame): blame window toggle
1 parent 6e3c665 commit 1e5f846

File tree

1 file changed

+31
-1
lines changed

1 file changed

+31
-1
lines changed

lua/gitsigns/actions/blame.lua

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,30 +332,59 @@ local function pmap(mode, lhs, cb, opts)
332332
end, opts)
333333
end
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
336352
function 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

Comments
 (0)