Patch 8.1.0394
Problem: Diffs are not always updated correctly.
Solution: When using internal diff update for any changes properly.
Files: src/structs.h, src/diff.c, src/proto/diff.pro, src/misc1.c,
src/main.c
*** ../vim-8.1.0393/src/structs.h 2018-09-13 18:33:02.366426166 +0200
--- src/structs.h 2018-09-16 13:55:20.676506925 +0200
***************
*** 2509,2515 ****
#ifdef FEAT_DIFF
diff_T *tp_first_diff;
buf_T *(tp_diffbuf[DB_COUNT]);
! int tp_diff_invalid; /* list of diffs is outdated */
#endif
frame_T *(tp_snapshot[SNAP_COUNT]); /* window layout snapshots */
#ifdef FEAT_EVAL
--- 2509,2516 ----
#ifdef FEAT_DIFF
diff_T *tp_first_diff;
buf_T *(tp_diffbuf[DB_COUNT]);
! int tp_diff_invalid; // list of diffs is outdated
! int tp_diff_update; // update diffs before redrawing
#endif
frame_T *(tp_snapshot[SNAP_COUNT]); /* window layout snapshots */
#ifdef FEAT_EVAL
*** ../vim-8.1.0393/src/diff.c 2018-09-15 19:17:07.510653263 +0200
--- src/diff.c 2018-09-16 13:57:36.259501809 +0200
***************
*** 292,297 ****
--- 292,307 ----
linenr_T lnum_deleted = line1; /* lnum of remaining deletion */
int check_unchanged;
+ if (diff_internal())
+ {
+ // Will udpate 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;
+ tp->tp_diff_update = TRUE;
+ return;
+ }
+
if (line2 == MAXLNUM)
{
/* mark_adjust(99, MAXLNUM, 9, 0): insert lines */
***************
*** 640,646 ****
*/
static void
diff_redraw(
! int dofold) /* also recompute the folds */
{
win_T *wp;
int n;
--- 650,656 ----
*/
static void
diff_redraw(
! int dofold) // also recompute the folds
{
win_T *wp;
int n;
***************
*** 863,869 ****
* Note that if the internal diff failed for one of the buffers, the external
* diff will be used anyway.
*/
! static int
diff_internal(void)
{
return (diff_flags & DIFF_INTERNAL) != 0 && *p_dex == NUL;
--- 873,879 ----
* Note that if the internal diff failed for one of the buffers, the external
* diff will be used anyway.
*/
! int
diff_internal(void)
{
return (diff_flags & DIFF_INTERNAL) != 0 && *p_dex == NUL;
***************
*** 887,895 ****
/*
* Completely update the diffs for the buffers involved.
! * This uses the ordinary "diff" command.
! * The buffers are written to a file, also for unmodified buffers (the file
! * could have been produced by autocommands, e.g. the netrw plugin).
*/
void
ex_diffupdate(exarg_T *eap) // "eap" can be NULL
--- 897,905 ----
/*
* Completely update the diffs for the buffers involved.
! * When using the external "diff" command the buffers are written to a file,
! * also for unmodified buffers (the file could have been produced by
! * autocommands, e.g. the netrw plugin).
*/
void
ex_diffupdate(exarg_T *eap) // "eap" can be NULL
*** ../vim-8.1.0393/src/proto/diff.pro 2018-05-17 13:52:31.000000000 +0200
--- src/proto/diff.pro 2018-09-15 19:36:03.456884220 +0200
***************
*** 4,9 ****
--- 4,10 ----
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);
+ int diff_internal(void);
void ex_diffupdate(exarg_T *eap);
void ex_diffpatch(exarg_T *eap);
void ex_diffsplit(exarg_T *eap);
*** ../vim-8.1.0393/src/misc1.c 2018-09-10 19:03:01.641716307 +0200
--- src/misc1.c 2018-09-16 14:00:38.606151494 +0200
***************
*** 3093,3099 ****
changed_lines_buf(curbuf, lnum, lnume, xtra);
#ifdef FEAT_DIFF
! if (xtra == 0 && curwin->w_p_diff)
{
/* When the number of lines doesn't change then mark_adjust() isn't
* called and other diff buffers still need to be marked for
--- 3093,3099 ----
changed_lines_buf(curbuf, lnum, lnume, xtra);
#ifdef FEAT_DIFF
! if (xtra == 0 && curwin->w_p_diff && !diff_internal())
{
/* When the number of lines doesn't change then mark_adjust() isn't
* called and other diff buffers still need to be marked for
***************
*** 3173,3178 ****
--- 3173,3183 ----
/* mark the buffer as modified */
changed();
+ #ifdef FEAT_DIFF
+ if (curwin->w_p_diff && diff_internal())
+ curtab->tp_diff_update = TRUE;
+ #endif
+
/* set the '. mark */
if (!cmdmod.keepjumps)
{
*** ../vim-8.1.0393/src/main.c 2018-09-13 15:33:39.605712221 +0200
--- src/main.c 2018-09-16 14:01:36.921719929 +0200
***************
*** 1200,1205 ****
--- 1200,1214 ----
}
#if defined(FEAT_DIFF)
+ // Updating diffs from changed() does not always work properly,
+ // esp. updating folds. Do an update just before redrawing if
+ // needed.
+ if (curtab->tp_diff_update || curtab->tp_diff_invalid)
+ {
+ ex_diffupdate(NULL);
+ curtab->tp_diff_update = FALSE;
+ }
+
/* Scroll-binding for diff mode may have been postponed until
* here. Avoids doing it for every change. */
if (diff_need_scrollbind)
*** ../vim-8.1.0393/src/version.c 2018-09-15 19:17:07.514653227 +0200
--- src/version.c 2018-09-15 20:13:51.888452794 +0200
***************
*** 796,797 ****
--- 796,799 ----
{ /* Add new patch number below this line */
+ /**/
+ 394,
/**/
--
hundred-and-one symptoms of being an internet addict:
60. As your car crashes through the guardrail on a mountain road, your first
instinct is to search for the "back" button.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.