summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-09-18 21:20:26 +0200
committerBram Moolenaar <Bram@vim.org>2018-09-18 21:20:26 +0200
commit198fa066b2ec011e91012c1a3d85a73df7b93f31 (patch)
treec6d89bae21680e07f70a481f8cc1d0860add4e4e
parent110bd60985c31e8978e9b071e2179f4233ef8557 (diff)
downloadvim-git-198fa066b2ec011e91012c1a3d85a73df7b93f31.tar.gz
patch 8.1.0402: the DiffUpdate event isn't triggered for :diffputv8.1.0402
Problem: The DiffUpdate event isn't triggered for :diffput. Solution: Also trigger DiffUpdate for :diffget and :diffput.
-rw-r--r--src/diff.c39
-rw-r--r--src/version.c2
2 files changed, 27 insertions, 14 deletions
diff --git a/src/diff.c b/src/diff.c
index d523e7743..d63bd9373 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -295,7 +295,7 @@ diff_mark_adjust_tp(
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 @@ ex_diffupdate(exarg_T *eap) // "eap" can be NULL
int idx_orig;
int idx_new;
diffio_T diffio;
+ int had_diffs = curtab->tp_first_diff != NULL;
if (diff_busy)
{
@@ -924,14 +925,14 @@ ex_diffupdate(exarg_T *eap) // "eap" can be NULL
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 @@ ex_diffupdate(exarg_T *eap) // "eap" can be NULL
// 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 @@ diffopt_changed(void)
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 @@ theend:
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 8195858c4..a8be96c4b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -795,6 +795,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 402,
+/**/
401,
/**/
400,