diff options
author | Bram Moolenaar <Bram@vim.org> | 2018-09-18 21:20:26 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2018-09-18 21:20:26 +0200 |
commit | 198fa066b2ec011e91012c1a3d85a73df7b93f31 (patch) | |
tree | c6d89bae21680e07f70a481f8cc1d0860add4e4e | |
parent | 110bd60985c31e8978e9b071e2179f4233ef8557 (diff) | |
download | vim-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.c | 39 | ||||
-rw-r--r-- | src/version.c | 2 |
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, |