diff options
-rw-r--r-- | src/diff.c | 7 | ||||
-rw-r--r-- | src/fold.c | 5 | ||||
-rw-r--r-- | src/globals.h | 3 | ||||
-rw-r--r-- | src/proto/diff.pro | 1 | ||||
-rw-r--r-- | src/screen.c | 6 | ||||
-rw-r--r-- | src/version.c | 2 |
6 files changed, 21 insertions, 3 deletions
diff --git a/src/diff.c b/src/diff.c index 260fdd96d..4c0041d41 100644 --- a/src/diff.c +++ b/src/diff.c @@ -75,7 +75,6 @@ static int diff_buf_idx_tp(buf_T *buf, tabpage_T *tp); static void diff_mark_adjust_tp(tabpage_T *tp, int idx, linenr_T line1, linenr_T line2, long amount, long amount_after); static void diff_check_unchanged(tabpage_T *tp, diff_T *dp); static int diff_check_sanity(tabpage_T *tp, diff_T *dp); -static void diff_redraw(int dofold); static int check_external_diff(diffio_T *diffio); static int diff_file(diffio_T *diffio); static int diff_equal_entry(diff_T *dp, int idx1, int idx2); @@ -520,7 +519,8 @@ diff_mark_adjust_tp( if (tp == curtab) { - diff_redraw(TRUE); + // Don't redraw right away, this updates the diffs, which can be slow. + need_diff_redraw = TRUE; /* Need to recompute the scroll binding, may remove or add filler * lines (e.g., when adding lines above w_topline). But it's slow when @@ -645,13 +645,14 @@ diff_check_sanity(tabpage_T *tp, diff_T *dp) /* * Mark all diff buffers in the current tab page for redraw. */ - static void + void diff_redraw( int dofold) // also recompute the folds { win_T *wp; int n; + need_diff_redraw = FALSE; FOR_ALL_WINDOWS(wp) if (wp->w_p_diff) { diff --git a/src/fold.c b/src/fold.c index 482d3c968..6200578fc 100644 --- a/src/fold.c +++ b/src/fold.c @@ -813,6 +813,11 @@ foldUpdate(win_T *wp, linenr_T top, linenr_T bot) if (disable_fold_update > 0) return; +#ifdef FEAT_DIFF + if (need_diff_redraw) + // will update later + return; +#endif /* Mark all folds from top to bot as maybe-small. */ (void)foldFind(&wp->w_folds, top, &fp); diff --git a/src/globals.h b/src/globals.h index d0837d3ff..712a739e4 100644 --- a/src/globals.h +++ b/src/globals.h @@ -1051,6 +1051,9 @@ EXTERN int maptick INIT(= 0); // tick for each non-mapped char EXTERN int must_redraw INIT(= 0); // type of redraw necessary EXTERN int skip_redraw INIT(= FALSE); // skip redraw once EXTERN int do_redraw INIT(= FALSE); // extra redraw once +#ifdef FEAT_DIFF +EXTERN int need_diff_redraw INIT(= 0); // need to call diff_redraw() +#endif EXTERN int need_highlight_changed INIT(= TRUE); diff --git a/src/proto/diff.pro b/src/proto/diff.pro index d6ab221da..2ab6c546f 100644 --- a/src/proto/diff.pro +++ b/src/proto/diff.pro @@ -4,6 +4,7 @@ void diff_buf_adjust(win_T *win); void diff_buf_add(buf_T *buf); void diff_invalidate(buf_T *buf); void diff_mark_adjust(linenr_T line1, linenr_T line2, long amount, long amount_after); +void diff_redraw(int dofold); int diff_internal(void); void ex_diffupdate(exarg_T *eap); void ex_diffpatch(exarg_T *eap); diff --git a/src/screen.c b/src/screen.c index 5043c0d7f..1681e1c57 100644 --- a/src/screen.c +++ b/src/screen.c @@ -567,6 +567,12 @@ update_screen(int type_arg) } #endif +#ifdef FEAT_DIFF + // May have postponed updating diffs. + if (need_diff_redraw) + diff_redraw(TRUE); +#endif + if (must_redraw) { if (type < must_redraw) /* use maximal type */ diff --git a/src/version.c b/src/version.c index 58d86e551..862b3d955 100644 --- a/src/version.c +++ b/src/version.c @@ -762,6 +762,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1922, +/**/ 1921, /**/ 1920, |