patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput
Problem: The DiffUpdate event isn't triggered for :diffput.
Solution: Also trigger DiffUpdate for :diffget and :diffput.
diff --git a/src/diff.c b/src/diff.c
index d523e77..d63bd93 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -295,7 +295,7 @@
if (diff_internal())
{
- // Will udpate diffs before redrawing. Set _invalid to update the
+ // Will update diffs before redrawing. Set _invalid to update the
// diffs themselves, set _update to also update folds properly just
// before redrawing.
tp->tp_diff_invalid = TRUE;
@@ -908,6 +908,7 @@
int idx_orig;
int idx_new;
diffio_T diffio;
+ int had_diffs = curtab->tp_first_diff != NULL;
if (diff_busy)
{
@@ -924,14 +925,14 @@
if (curtab->tp_diffbuf[idx_orig] != NULL)
break;
if (idx_orig == DB_COUNT)
- return;
+ goto theend;
// Only need to do something when there is another buffer.
for (idx_new = idx_orig + 1; idx_new < DB_COUNT; ++idx_new)
if (curtab->tp_diffbuf[idx_new] != NULL)
break;
if (idx_new == DB_COUNT)
- return;
+ goto theend;
// Only use the internal method if it did not fail for one of the buffers.
vim_memset(&diffio, 0, sizeof(diffio));
@@ -948,9 +949,14 @@
// force updating cursor position on screen
curwin->w_valid_cursor.lnum = 0;
- diff_redraw(TRUE);
-
- apply_autocmds(EVENT_DIFFUPDATED, NULL, NULL, FALSE, curbuf);
+theend:
+ // A redraw is needed if there were diffs and they were cleared, or there
+ // are diffs now, which means they got updated.
+ if (had_diffs || curtab->tp_first_diff != NULL)
+ {
+ diff_redraw(TRUE);
+ apply_autocmds(EVENT_DIFFUPDATED, NULL, NULL, FALSE, curbuf);
+ }
}
/*
@@ -2272,7 +2278,8 @@
if ((diff_flags_new & DIFF_HORIZONTAL) && (diff_flags_new & DIFF_VERTICAL))
return FAIL;
- /* If "icase" or "iwhite" was added or removed, need to update the diff. */
+ // If flags were added or removed, or the algorithm was changed, need to
+ // update the diff.
if (diff_flags != diff_flags_new || diff_algorithm != diff_algorithm_new)
FOR_ALL_TABPAGES(tp)
tp->tp_diff_invalid = TRUE;
@@ -2845,14 +2852,18 @@
diff_need_update = FALSE;
ex_diffupdate(NULL);
}
+ else
+ {
+ // Check that the cursor is on a valid character and update it's
+ // position. When there were filler lines the topline has become
+ // invalid.
+ check_cursor();
+ changed_line_abv_curs();
- /* Check that the cursor is on a valid character and update it's position.
- * When there were filler lines the topline has become invalid. */
- check_cursor();
- changed_line_abv_curs();
-
- /* Also need to redraw the other buffers. */
- diff_redraw(FALSE);
+ // Also need to redraw the other buffers.
+ diff_redraw(FALSE);
+ apply_autocmds(EVENT_DIFFUPDATED, NULL, NULL, FALSE, curbuf);
+ }
}
#ifdef FEAT_FOLDING
diff --git a/src/version.c b/src/version.c
index 8195858..a8be96c 100644
--- a/src/version.c
+++ b/src/version.c
@@ -795,6 +795,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 402,
+/**/
401,
/**/
400,