mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 8.1.1922: in diff mode global operations can be very slow
Problem: In diff mode global operations can be very slow. Solution: Do not call diff_redraw() many times, call it once when redrawing. And also don't update folds multiple times.
This commit is contained in:
@@ -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_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 void diff_check_unchanged(tabpage_T *tp, diff_T *dp);
|
||||||
static int diff_check_sanity(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 check_external_diff(diffio_T *diffio);
|
||||||
static int diff_file(diffio_T *diffio);
|
static int diff_file(diffio_T *diffio);
|
||||||
static int diff_equal_entry(diff_T *dp, int idx1, int idx2);
|
static int diff_equal_entry(diff_T *dp, int idx1, int idx2);
|
||||||
@@ -520,7 +519,8 @@ diff_mark_adjust_tp(
|
|||||||
|
|
||||||
if (tp == curtab)
|
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
|
/* 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
|
* 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.
|
* Mark all diff buffers in the current tab page for redraw.
|
||||||
*/
|
*/
|
||||||
static void
|
void
|
||||||
diff_redraw(
|
diff_redraw(
|
||||||
int dofold) // also recompute the folds
|
int dofold) // also recompute the folds
|
||||||
{
|
{
|
||||||
win_T *wp;
|
win_T *wp;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
|
need_diff_redraw = FALSE;
|
||||||
FOR_ALL_WINDOWS(wp)
|
FOR_ALL_WINDOWS(wp)
|
||||||
if (wp->w_p_diff)
|
if (wp->w_p_diff)
|
||||||
{
|
{
|
||||||
|
@@ -813,6 +813,11 @@ foldUpdate(win_T *wp, linenr_T top, linenr_T bot)
|
|||||||
|
|
||||||
if (disable_fold_update > 0)
|
if (disable_fold_update > 0)
|
||||||
return;
|
return;
|
||||||
|
#ifdef FEAT_DIFF
|
||||||
|
if (need_diff_redraw)
|
||||||
|
// will update later
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Mark all folds from top to bot as maybe-small. */
|
/* Mark all folds from top to bot as maybe-small. */
|
||||||
(void)foldFind(&wp->w_folds, top, &fp);
|
(void)foldFind(&wp->w_folds, top, &fp);
|
||||||
|
@@ -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 must_redraw INIT(= 0); // type of redraw necessary
|
||||||
EXTERN int skip_redraw INIT(= FALSE); // skip redraw once
|
EXTERN int skip_redraw INIT(= FALSE); // skip redraw once
|
||||||
EXTERN int do_redraw INIT(= FALSE); // extra 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);
|
EXTERN int need_highlight_changed INIT(= TRUE);
|
||||||
|
|
||||||
|
@@ -4,6 +4,7 @@ void diff_buf_adjust(win_T *win);
|
|||||||
void diff_buf_add(buf_T *buf);
|
void diff_buf_add(buf_T *buf);
|
||||||
void diff_invalidate(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_mark_adjust(linenr_T line1, linenr_T line2, long amount, long amount_after);
|
||||||
|
void diff_redraw(int dofold);
|
||||||
int diff_internal(void);
|
int diff_internal(void);
|
||||||
void ex_diffupdate(exarg_T *eap);
|
void ex_diffupdate(exarg_T *eap);
|
||||||
void ex_diffpatch(exarg_T *eap);
|
void ex_diffpatch(exarg_T *eap);
|
||||||
|
@@ -567,6 +567,12 @@ update_screen(int type_arg)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef FEAT_DIFF
|
||||||
|
// May have postponed updating diffs.
|
||||||
|
if (need_diff_redraw)
|
||||||
|
diff_redraw(TRUE);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (must_redraw)
|
if (must_redraw)
|
||||||
{
|
{
|
||||||
if (type < must_redraw) /* use maximal type */
|
if (type < must_redraw) /* use maximal type */
|
||||||
|
@@ -761,6 +761,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1922,
|
||||||
/**/
|
/**/
|
||||||
1921,
|
1921,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user