From 75dc649106827183547d3bedd4602442340d2f7f Mon Sep 17 00:00:00 2001 From: Lewis Russell Date: Tue, 28 May 2024 10:51:42 +0100 Subject: [PATCH] fix(attach): detach on when the buffer name changes Fixes #1021 --- lua/gitsigns.lua | 16 ++++++++++++++-- lua/gitsigns/util.lua | 9 +++++++++ lua/gitsigns/watcher.lua | 7 ++++++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lua/gitsigns.lua b/lua/gitsigns.lua index 3573b42d9..cfff4472c 100644 --- a/lua/gitsigns.lua +++ b/lua/gitsigns.lua @@ -129,8 +129,10 @@ local function setup_attach() local attach_autocmd_disabled = false - api.nvim_create_autocmd({ 'BufRead', 'BufNewFile', 'BufWritePost' }, { + -- Need to attach in 'BufFilePost' since we always detach in 'BufFilePre' + api.nvim_create_autocmd({ 'BufFilePost', 'BufRead', 'BufNewFile', 'BufWritePost' }, { group = 'gitsigns', + desc = 'Gitsigns: attach', callback = function(args) local bufnr = args.buf --[[@as integer]] if attach_autocmd_disabled then @@ -142,11 +144,21 @@ local function setup_attach() end, }) + -- If the buffer name is about to change, then detach + api.nvim_create_autocmd('BufFilePre', { + group = 'gitsigns', + desc = 'Gitsigns: detach when changing buffer names', + callback = function(args) + require('gitsigns.attach').detach(args.buf) + end, + }) + --- vimpgrep creates and deletes lots of buffers so attaching to each one will - --- waste lots of resource and even slow down vimgrep. + --- waste lots of resource and slow down vimgrep. api.nvim_create_autocmd({ 'QuickFixCmdPre', 'QuickFixCmdPost' }, { group = 'gitsigns', pattern = '*vimgrep*', + desc = 'Gitsigns: disable attach during vimgrep', callback = function(args) attach_autocmd_disabled = args.event == 'QuickFixCmdPre' end, diff --git a/lua/gitsigns/util.lua b/lua/gitsigns/util.lua index 613c6679a..35e0fce58 100644 --- a/lua/gitsigns/util.lua +++ b/lua/gitsigns/util.lua @@ -116,6 +116,15 @@ function M.buf_rename(bufnr, name) delete_alt(bufnr) end +--- @param events string[] +--- @param f fun() +function M.noautocmd(events, f) + local ei = vim.o.eventignore + vim.o.eventignore = table.concat(events, ',') + f() + vim.o.eventignore = ei +end + --- @param bufnr integer --- @param start_row integer --- @param end_row integer diff --git a/lua/gitsigns/watcher.lua b/lua/gitsigns/watcher.lua index 65218aa9d..c3d89089c 100644 --- a/lua/gitsigns/watcher.lua +++ b/lua/gitsigns/watcher.lua @@ -52,7 +52,12 @@ local function handle_moved(bufnr, old_relpath) local old_name = api.nvim_buf_get_name(bufnr) if not bufexists then - util.buf_rename(bufnr, bcache.file) + -- Do not trigger BufFilePre/Post + -- TODO(lewis6991): figure out how to avoid reattaching without + -- disabling all autocommands. + util.noautocmd({ 'BufFilePre', 'BufFilePost' }, function() + util.buf_rename(bufnr, bcache.file) + end) end local msg = bufexists and 'Cannot rename' or 'Renamed'