Skip to content

Commit 6ebbfe0

Browse files
brammooldouglasdrumond
authored andcommitted
patch 7.4.768 Problem: :diffoff only works properly once. Solution: Also make :diffoff work when used a second time. (Olaf Dabrunz)
1 parent 02c1b1e commit 6ebbfe0

File tree

2 files changed

+40
-45
lines changed

2 files changed

+40
-45
lines changed

src/diff.c

Lines changed: 38 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1138,32 +1138,34 @@ diff_win_options(wp, addbuf)
11381138
curwin = old_curwin;
11391139
# endif
11401140

1141-
wp->w_p_diff = TRUE;
1142-
11431141
/* Use 'scrollbind' and 'cursorbind' when available */
11441142
#ifdef FEAT_SCROLLBIND
1145-
if (!wp->w_p_diff_saved)
1143+
if (!wp->w_p_diff)
11461144
wp->w_p_scb_save = wp->w_p_scb;
11471145
wp->w_p_scb = TRUE;
11481146
#endif
11491147
#ifdef FEAT_CURSORBIND
1150-
if (!wp->w_p_diff_saved)
1148+
if (!wp->w_p_diff)
11511149
wp->w_p_crb_save = wp->w_p_crb;
11521150
wp->w_p_crb = TRUE;
11531151
#endif
1154-
if (!wp->w_p_diff_saved)
1152+
if (!wp->w_p_diff)
11551153
wp->w_p_wrap_save = wp->w_p_wrap;
11561154
wp->w_p_wrap = FALSE;
11571155
# ifdef FEAT_FOLDING
11581156
curwin = wp;
11591157
curbuf = curwin->w_buffer;
1160-
if (!wp->w_p_diff_saved)
1158+
if (!wp->w_p_diff)
1159+
{
1160+
if (wp->w_p_diff_saved)
1161+
free_string_option(wp->w_p_fdm_save);
11611162
wp->w_p_fdm_save = vim_strsave(wp->w_p_fdm);
1163+
}
11621164
set_string_option_direct((char_u *)"fdm", -1, (char_u *)"diff",
11631165
OPT_LOCAL|OPT_FREE, 0);
11641166
curwin = old_curwin;
11651167
curbuf = curwin->w_buffer;
1166-
if (!wp->w_p_diff_saved)
1168+
if (!wp->w_p_diff)
11671169
{
11681170
wp->w_p_fdc_save = wp->w_p_fdc;
11691171
wp->w_p_fen_save = wp->w_p_fen;
@@ -1183,6 +1185,8 @@ diff_win_options(wp, addbuf)
11831185
/* Saved the current values, to be restored in ex_diffoff(). */
11841186
wp->w_p_diff_saved = TRUE;
11851187

1188+
wp->w_p_diff = TRUE;
1189+
11861190
if (addbuf)
11871191
diff_buf_add(wp->w_buffer);
11881192
redraw_win_later(wp, NOT_VALID);
@@ -1197,7 +1201,6 @@ ex_diffoff(eap)
11971201
exarg_T *eap;
11981202
{
11991203
win_T *wp;
1200-
win_T *old_curwin = curwin;
12011204
#ifdef FEAT_SCROLLBIND
12021205
int diffwin = FALSE;
12031206
#endif
@@ -1206,57 +1209,47 @@ ex_diffoff(eap)
12061209
{
12071210
if (eap->forceit ? wp->w_p_diff : wp == curwin)
12081211
{
1209-
/* Set 'diff', 'scrollbind' off and 'wrap' on. If option values
1210-
* were saved in diff_win_options() restore them. */
1212+
/* Set 'diff' off. If option values were saved in
1213+
* diff_win_options(), restore the ones whose settings seem to have
1214+
* been left over from diff mode. */
12111215
wp->w_p_diff = FALSE;
12121216

1217+
if (wp->w_p_diff_saved)
1218+
{
1219+
12131220
#ifdef FEAT_SCROLLBIND
1214-
if (wp->w_p_scb)
1215-
wp->w_p_scb = wp->w_p_diff_saved ? wp->w_p_scb_save : FALSE;
1221+
if (wp->w_p_scb)
1222+
wp->w_p_scb = wp->w_p_scb_save;
12161223
#endif
12171224
#ifdef FEAT_CURSORBIND
1218-
if (wp->w_p_crb)
1219-
wp->w_p_crb = wp->w_p_diff_saved ? wp->w_p_crb_save : FALSE;
1225+
if (wp->w_p_crb)
1226+
wp->w_p_crb = wp->w_p_crb_save;
12201227
#endif
1221-
if (!wp->w_p_wrap)
1222-
wp->w_p_wrap = wp->w_p_diff_saved ? wp->w_p_wrap_save : TRUE;
1228+
if (!wp->w_p_wrap)
1229+
wp->w_p_wrap = wp->w_p_wrap_save;
12231230
#ifdef FEAT_FOLDING
1224-
curwin = wp;
1225-
curbuf = curwin->w_buffer;
1226-
if (wp->w_p_diff_saved)
1227-
{
12281231
free_string_option(wp->w_p_fdm);
1229-
wp->w_p_fdm = wp->w_p_fdm_save;
1230-
wp->w_p_fdm_save = empty_option;
1231-
}
1232-
else
1233-
set_string_option_direct((char_u *)"fdm", -1,
1234-
(char_u *)"manual", OPT_LOCAL|OPT_FREE, 0);
1235-
curwin = old_curwin;
1236-
curbuf = curwin->w_buffer;
1237-
if (wp->w_p_fdc == diff_foldcolumn)
1238-
wp->w_p_fdc = wp->w_p_diff_saved ? wp->w_p_fdc_save : 0;
1239-
if (wp->w_p_fdl == 0 && wp->w_p_diff_saved)
1240-
wp->w_p_fdl = wp->w_p_fdl_save;
1241-
1242-
if (wp->w_p_fen)
1243-
{
1232+
wp->w_p_fdm = vim_strsave(wp->w_p_fdm_save);
1233+
1234+
if (wp->w_p_fdc == diff_foldcolumn)
1235+
wp->w_p_fdc = wp->w_p_fdc_save;
1236+
if (wp->w_p_fdl == 0)
1237+
wp->w_p_fdl = wp->w_p_fdl_save;
1238+
12441239
/* Only restore 'foldenable' when 'foldmethod' is not
12451240
* "manual", otherwise we continue to show the diff folds. */
1246-
if (foldmethodIsManual(wp) || !wp->w_p_diff_saved)
1247-
wp->w_p_fen = FALSE;
1248-
else
1249-
wp->w_p_fen = wp->w_p_fen_save;
1250-
}
1241+
if (wp->w_p_fen)
1242+
wp->w_p_fen = foldmethodIsManual(wp) ? FALSE
1243+
: wp->w_p_fen_save;
12511244

1252-
foldUpdateAll(wp);
1253-
/* make sure topline is not halfway a fold */
1254-
changed_window_setting_win(wp);
1245+
foldUpdateAll(wp);
1246+
/* make sure topline is not halfway a fold */
1247+
changed_window_setting_win(wp);
12551248
#endif
1249+
}
1250+
12561251
/* Note: 'sbo' is not restored, it's a global option. */
12571252
diff_buf_adjust(wp);
1258-
1259-
wp->w_p_diff_saved = FALSE;
12601253
}
12611254
#ifdef FEAT_SCROLLBIND
12621255
diffwin |= wp->w_p_diff;

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -756,6 +756,8 @@ static char *(features[]) =
756756

757757
static int included_patches[] =
758758
{ /* Add new patch number below this line */
759+
/**/
760+
768,
759761
/**/
760762
767,
761763
/**/

0 commit comments

Comments
 (0)