From 24db59ca8fc6f2f5f96ad71d83c265170bc341db Mon Sep 17 00:00:00 2001 From: Rom Grk Date: Mon, 2 Nov 2020 02:11:22 -0500 Subject: feat: implement BufModified autocmd --- src/nvim/auevents.lua | 2 ++ src/nvim/buffer_defs.h | 2 ++ src/nvim/change.c | 2 ++ src/nvim/edit.c | 8 ++++++++ src/nvim/normal.c | 11 +++++++++++ 5 files changed, 25 insertions(+) (limited to 'src') diff --git a/src/nvim/auevents.lua b/src/nvim/auevents.lua index 9c28398f5b..1eafd3d0da 100644 --- a/src/nvim/auevents.lua +++ b/src/nvim/auevents.lua @@ -7,6 +7,7 @@ return { 'BufFilePre', -- before renaming a buffer 'BufHidden', -- just after buffer becomes hidden 'BufLeave', -- before leaving a buffer + 'BufModified', -- after the 'modified' state of a buffer changes 'BufNew', -- after creating any buffer 'BufNewFile', -- when creating a buffer for a new file 'BufReadCmd', -- read buffer using command @@ -124,6 +125,7 @@ return { -- List of nvim-specific events or aliases for the purpose of generating -- syntax file nvim_specific = { + BufModified=true, DirChanged=true, Signal=true, TabClosed=true, diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h index 0b89dff92f..a72fe69425 100644 --- a/src/nvim/buffer_defs.h +++ b/src/nvim/buffer_defs.h @@ -541,6 +541,8 @@ struct file_buffer { int b_changed; // 'modified': Set to true if something in the // file has been changed and not written out. + bool b_changed_notified; // if the BufModified autocmd has been triggered + // since the last time b_changed was modified /// Change-identifier incremented for each change, including undo. /// diff --git a/src/nvim/change.c b/src/nvim/change.c index 9ee987b45d..3c1af1f46a 100644 --- a/src/nvim/change.c +++ b/src/nvim/change.c @@ -129,6 +129,7 @@ void changed(void) void changed_internal(void) { curbuf->b_changed = true; + curbuf->b_changed_notified = false; ml_setflags(curbuf); check_status(curbuf); redraw_tabline = true; @@ -502,6 +503,7 @@ void unchanged(buf_T *buf, int ff, bool always_inc_changedtick) { if (buf->b_changed || (ff && file_ff_differs(buf, false))) { buf->b_changed = false; + buf->b_changed_notified = false; ml_setflags(buf); if (ff) { save_file_ff(buf); diff --git a/src/nvim/edit.c b/src/nvim/edit.c index d7cca9ba36..281e1f3a28 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -1488,6 +1488,14 @@ static void ins_redraw( do_autocmd_winscrolled(curwin); } + // Trigger BufModified if b_changed_notified is false. + if (ready && has_event(EVENT_BUFMODIFIED) + && curbuf->b_changed_notified == false + && !pum_visible()) { + apply_autocmds(EVENT_BUFMODIFIED, NULL, NULL, false, curbuf); + curbuf->b_changed_notified = true; + } + if (curwin->w_p_cole > 0 && conceal_cursor_line(curwin) && conceal_cursor_moved) { redrawWinline(curwin, curwin->w_cursor.lnum); diff --git a/src/nvim/normal.c b/src/nvim/normal.c index 771ca732f4..1362e95ee0 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -1229,6 +1229,16 @@ static void normal_check_text_changed(NormalState *s) } } +static void normal_check_buffer_modified(NormalState *s) +{ + // Trigger BufModified if b_modified changed + if (!finish_op && has_event(EVENT_BUFMODIFIED) + && curbuf->b_changed_notified == false) { + apply_autocmds(EVENT_BUFMODIFIED, NULL, NULL, false, curbuf); + curbuf->b_changed_notified = true; + } +} + static void normal_check_folds(NormalState *s) { // Include a closed fold completely in the Visual area. @@ -1336,6 +1346,7 @@ static int normal_check(VimState *state) normal_check_cursor_moved(s); normal_check_text_changed(s); normal_check_window_scrolled(s); + normal_check_buffer_modified(s); // Updating diffs from changed() does not always work properly, // esp. updating folds. Do an update just before redrawing if -- cgit From c3a82fbae5f37ebd66f8765845f9e9cfc0ec8b60 Mon Sep 17 00:00:00 2001 From: Rom Grk Date: Sat, 7 Nov 2020 19:09:51 -0500 Subject: fix: rename to BufModifiedSet --- src/nvim/edit.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/nvim/edit.c b/src/nvim/edit.c index 281e1f3a28..9ce587a8c6 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -1489,10 +1489,10 @@ static void ins_redraw( } // Trigger BufModified if b_changed_notified is false. - if (ready && has_event(EVENT_BUFMODIFIED) + if (ready && has_event(EVENT_BUFMODIFIEDSET) && curbuf->b_changed_notified == false && !pum_visible()) { - apply_autocmds(EVENT_BUFMODIFIED, NULL, NULL, false, curbuf); + apply_autocmds(EVENT_BUFMODIFIEDSET, NULL, NULL, false, curbuf); curbuf->b_changed_notified = true; } -- cgit From 56f842e87378bb8de99b98e3aacd7714cfeed1ef Mon Sep 17 00:00:00 2001 From: Rom Grk Date: Sat, 7 Nov 2020 19:17:43 -0500 Subject: fix: finish renaming to BufModifiedSet --- src/nvim/auevents.lua | 4 ++-- src/nvim/normal.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/nvim/auevents.lua b/src/nvim/auevents.lua index 1eafd3d0da..6be51c504c 100644 --- a/src/nvim/auevents.lua +++ b/src/nvim/auevents.lua @@ -7,7 +7,7 @@ return { 'BufFilePre', -- before renaming a buffer 'BufHidden', -- just after buffer becomes hidden 'BufLeave', -- before leaving a buffer - 'BufModified', -- after the 'modified' state of a buffer changes + 'BufModifiedSet', -- after the 'modified' state of a buffer changes 'BufNew', -- after creating any buffer 'BufNewFile', -- when creating a buffer for a new file 'BufReadCmd', -- read buffer using command @@ -125,7 +125,7 @@ return { -- List of nvim-specific events or aliases for the purpose of generating -- syntax file nvim_specific = { - BufModified=true, + BufModifiedSet=true, DirChanged=true, Signal=true, TabClosed=true, diff --git a/src/nvim/normal.c b/src/nvim/normal.c index 1362e95ee0..f78f5a1d1f 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -1232,9 +1232,9 @@ static void normal_check_text_changed(NormalState *s) static void normal_check_buffer_modified(NormalState *s) { // Trigger BufModified if b_modified changed - if (!finish_op && has_event(EVENT_BUFMODIFIED) + if (!finish_op && has_event(EVENT_BUFMODIFIEDSET) && curbuf->b_changed_notified == false) { - apply_autocmds(EVENT_BUFMODIFIED, NULL, NULL, false, curbuf); + apply_autocmds(EVENT_BUFMODIFIEDSET, NULL, NULL, false, curbuf); curbuf->b_changed_notified = true; } } -- cgit From 743f7c8f72ef72e5348d0513a263cb4fe068f1f4 Mon Sep 17 00:00:00 2001 From: Rom Grk Date: Mon, 9 Nov 2020 04:05:25 -0500 Subject: fix: address issues for BufModifiedSet --- src/nvim/buffer_defs.h | 5 +++-- src/nvim/change.c | 4 ++-- src/nvim/edit.c | 6 +++--- src/nvim/normal.c | 4 ++-- 4 files changed, 10 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h index a72fe69425..93fe37b585 100644 --- a/src/nvim/buffer_defs.h +++ b/src/nvim/buffer_defs.h @@ -541,8 +541,9 @@ struct file_buffer { int b_changed; // 'modified': Set to true if something in the // file has been changed and not written out. - bool b_changed_notified; // if the BufModified autocmd has been triggered - // since the last time b_changed was modified + bool b_changed_invalid; // Set if BufModified autocmd has not been + // triggered since the last time b_changed was + // modified. /// Change-identifier incremented for each change, including undo. /// diff --git a/src/nvim/change.c b/src/nvim/change.c index 3c1af1f46a..271d350967 100644 --- a/src/nvim/change.c +++ b/src/nvim/change.c @@ -129,7 +129,7 @@ void changed(void) void changed_internal(void) { curbuf->b_changed = true; - curbuf->b_changed_notified = false; + curbuf->b_changed_invalid = true; ml_setflags(curbuf); check_status(curbuf); redraw_tabline = true; @@ -503,7 +503,7 @@ void unchanged(buf_T *buf, int ff, bool always_inc_changedtick) { if (buf->b_changed || (ff && file_ff_differs(buf, false))) { buf->b_changed = false; - buf->b_changed_notified = false; + buf->b_changed_invalid = true; ml_setflags(buf); if (ff) { save_file_ff(buf); diff --git a/src/nvim/edit.c b/src/nvim/edit.c index 9ce587a8c6..9c8d64a6b2 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -1488,12 +1488,12 @@ static void ins_redraw( do_autocmd_winscrolled(curwin); } - // Trigger BufModified if b_changed_notified is false. + // Trigger BufModified if b_changed_invalid is set. if (ready && has_event(EVENT_BUFMODIFIEDSET) - && curbuf->b_changed_notified == false + && curbuf->b_changed_invalid == true && !pum_visible()) { apply_autocmds(EVENT_BUFMODIFIEDSET, NULL, NULL, false, curbuf); - curbuf->b_changed_notified = true; + curbuf->b_changed_invalid = false; } if (curwin->w_p_cole > 0 && conceal_cursor_line(curwin) diff --git a/src/nvim/normal.c b/src/nvim/normal.c index f78f5a1d1f..2805a7d74e 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -1233,9 +1233,9 @@ static void normal_check_buffer_modified(NormalState *s) { // Trigger BufModified if b_modified changed if (!finish_op && has_event(EVENT_BUFMODIFIEDSET) - && curbuf->b_changed_notified == false) { + && curbuf->b_changed_invalid == true) { apply_autocmds(EVENT_BUFMODIFIEDSET, NULL, NULL, false, curbuf); - curbuf->b_changed_notified = true; + curbuf->b_changed_invalid = false; } } -- cgit