From ec6aab13efe5363b3fe8aa6122d1a56b728a9041 Mon Sep 17 00:00:00 2001 From: Lewis Russell Date: Fri, 5 Apr 2024 14:19:03 +0100 Subject: [PATCH] feat(autocmd) add GitSignsChanged Resolves #507 --- doc/gitsigns.txt | 15 +++++++++++---- etc/doc_template.txt | 15 +++++++++++---- lua/gitsigns/git.lua | 15 +++++++++++++++ 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/doc/gitsigns.txt b/doc/gitsigns.txt index a23d26b..8e4e633 100644 --- a/doc/gitsigns.txt +++ b/doc/gitsigns.txt @@ -1181,18 +1181,25 @@ via the config, see |gitsigns-config-keymaps|. The lua implementation is exposed through |gitsigns.select_hunk()|. ============================================================================== -EVENT *gitsigns-event* +EVENTS *gitsigns-events* -Every time Gitsigns updates its knowledge about hunks, it issues a custom -|User| event named `GitSignsUpdate`. You can use it via usual autocommands, -like so: >lua +|User| |autocommands| provided to allow extending behaviors. +Example: >lua vim.api.nvim_create_autocmd('User', { pattern = 'GitSignsUpdate', callback = function(args) print(os.time(), ' Gitsigns made an update on ', args.data.buffer) end }) +< + *User_GitSignsUpdate* +GitSignsUpdate After Gitsigns updates its knowledge about hunks. + Provides `bufnr` in the autocmd user data. + + *User_GitSignsChanged* +GitSignsChanged After any event in which Gitsigns can potentially change + the repository. Provides `file` in the autocmd user data. ------------------------------------------------------------------------------ vim:tw=78:ts=8:ft=help:norl: diff --git a/etc/doc_template.txt b/etc/doc_template.txt index 13233e9..5a0402b 100644 --- a/etc/doc_template.txt +++ b/etc/doc_template.txt @@ -163,18 +163,25 @@ via the config, see |gitsigns-config-keymaps|. The lua implementation is exposed through |gitsigns.select_hunk()|. ============================================================================== -EVENT *gitsigns-event* +EVENTS *gitsigns-events* -Every time Gitsigns updates its knowledge about hunks, it issues a custom -|User| event named `GitSignsUpdate`. You can use it via usual autocommands, -like so: >lua +|User| |autocommands| provided to allow extending behaviors. +Example: >lua vim.api.nvim_create_autocmd('User', { pattern = 'GitSignsUpdate', callback = function(args) print(os.time(), ' Gitsigns made an update on ', args.data.buffer) end }) +< + *User_GitSignsUpdate* +GitSignsUpdate After Gitsigns updates its knowledge about hunks. + Provides `bufnr` in the autocmd user data. + + *User_GitSignsChanged* +GitSignsChanged After any event in which Gitsigns can potentially change + the repository. Provides `file` in the autocmd user data. ------------------------------------------------------------------------------ vim:tw=78:ts=8:ft=help:norl: diff --git a/lua/gitsigns/git.lua b/lua/gitsigns/git.lua index 9503ccb..5ae7bd2 100644 --- a/lua/gitsigns/git.lua +++ b/lua/gitsigns/git.lua @@ -486,8 +486,19 @@ function Obj:get_show_text(revision) return stdout, stderr end +local function autocmd_changed(file) + vim.schedule(function() + vim.api.nvim_exec_autocmds('User', { + pattern = 'GitSignsChanged', + modeline = false, + data = { file = file }, + }) + end) +end + function Obj:unstage_file() self:command({ 'reset', self.file }) + autocmd_changed(self.file) end --- @class Gitsigns.CommitInfo @@ -734,6 +745,8 @@ function Obj:stage_lines(lines) '--cacheinfo', string.format('%s,%s,%s', self.mode_bits, new_object, self.relpath), }) + + autocmd_changed(self.file) end --- @param hunks Gitsigns.Hunk.Hunk[] @@ -761,6 +774,8 @@ function Obj:stage_hunks(hunks, invert) }, { stdin = patch, }) + + autocmd_changed(self.file) end --- @return string?