Mercurial > vim
changeset 14780:552523e44923 v8.1.0402
patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput
commit https://github.com/vim/vim/commit/198fa066b2ec011e91012c1a3d85a73df7b93f31
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Sep 18 21:20:26 2018 +0200
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.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 18 Sep 2018 21:30:06 +0200 |
parents | 0ce4ed87ddef |
children | 24b518b71eca |
files | src/diff.c src/version.c |
diffstat | 2 files changed, 27 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- 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 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 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 // 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