Skip to content

Commit 47aee4e

Browse files
committed
updated for version 7.3.1294
Problem: ":diffoff" resets options. Solution: Save and restore option values. (Christian Brabandt)
1 parent b10277d commit 47aee4e

File tree

4 files changed

+80
-7
lines changed

4 files changed

+80
-7
lines changed

src/diff.c

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1138,21 +1138,36 @@ diff_win_options(wp, addbuf)
11381138
# endif
11391139

11401140
wp->w_p_diff = TRUE;
1141+
11411142
/* Use 'scrollbind' and 'cursorbind' when available */
11421143
#ifdef FEAT_SCROLLBIND
1144+
if (!wp->w_p_diff_saved)
1145+
wp->w_p_scb_save = wp->w_p_scb;
11431146
wp->w_p_scb = TRUE;
11441147
#endif
11451148
#ifdef FEAT_CURSORBIND
1149+
if (!wp->w_p_diff_saved)
1150+
wp->w_p_crb_save = wp->w_p_crb;
11461151
wp->w_p_crb = TRUE;
11471152
#endif
1153+
if (!wp->w_p_diff_saved)
1154+
wp->w_p_wrap_save = wp->w_p_wrap;
11481155
wp->w_p_wrap = FALSE;
11491156
# ifdef FEAT_FOLDING
11501157
curwin = wp;
11511158
curbuf = curwin->w_buffer;
1159+
if (!wp->w_p_diff_saved)
1160+
wp->w_p_fdm_save = vim_strsave(wp->w_p_fdm);
11521161
set_string_option_direct((char_u *)"fdm", -1, (char_u *)"diff",
11531162
OPT_LOCAL|OPT_FREE, 0);
11541163
curwin = old_curwin;
11551164
curbuf = curwin->w_buffer;
1165+
if (!wp->w_p_diff_saved)
1166+
{
1167+
wp->w_p_fdc_save = wp->w_p_fdc;
1168+
wp->w_p_fen_save = wp->w_p_fen;
1169+
wp->w_p_fdl_save = wp->w_p_fdl;
1170+
}
11561171
wp->w_p_fdc = diff_foldcolumn;
11571172
wp->w_p_fen = TRUE;
11581173
wp->w_p_fdl = 0;
@@ -1164,6 +1179,8 @@ diff_win_options(wp, addbuf)
11641179
if (vim_strchr(p_sbo, 'h') == NULL)
11651180
do_cmdline_cmd((char_u *)"set sbo+=hor");
11661181
#endif
1182+
/* Saved the current values, to be restored in ex_diffoff(). */
1183+
wp->w_p_diff_saved = TRUE;
11671184

11681185
if (addbuf)
11691186
diff_buf_add(wp->w_buffer);
@@ -1188,25 +1205,48 @@ ex_diffoff(eap)
11881205
{
11891206
if (wp == curwin || (eap->forceit && wp->w_p_diff))
11901207
{
1191-
/* Set 'diff', 'scrollbind' off and 'wrap' on. */
1208+
/* Set 'diff', 'scrollbind' off and 'wrap' on. If option values
1209+
* were saved in diff_win_options() restore them. */
11921210
wp->w_p_diff = FALSE;
1193-
RESET_BINDING(wp);
1194-
wp->w_p_wrap = TRUE;
1211+
1212+
#ifdef FEAT_SCROLLBIND
1213+
if (wp->w_p_scb)
1214+
wp->w_p_scb = wp->w_p_diff_saved ? wp->w_p_scb_save : FALSE;
1215+
#endif
1216+
#ifdef FEAT_CURSORBIND
1217+
if (wp->w_p_crb)
1218+
wp->w_p_crb = wp->w_p_diff_saved ? wp->w_p_crb_save : FALSE;
1219+
#endif
1220+
if (!wp->w_p_wrap)
1221+
wp->w_p_wrap = wp->w_p_diff_saved ? wp->w_p_wrap_save : TRUE;
11951222
#ifdef FEAT_FOLDING
11961223
curwin = wp;
11971224
curbuf = curwin->w_buffer;
1198-
set_string_option_direct((char_u *)"fdm", -1,
1225+
if (wp->w_p_diff_saved)
1226+
{
1227+
free_string_option(wp->w_p_fdm);
1228+
wp->w_p_fdm = wp->w_p_fdm_save;
1229+
wp->w_p_fdm_save = empty_option;
1230+
}
1231+
else
1232+
set_string_option_direct((char_u *)"fdm", -1,
11991233
(char_u *)"manual", OPT_LOCAL|OPT_FREE, 0);
12001234
curwin = old_curwin;
12011235
curbuf = curwin->w_buffer;
1202-
wp->w_p_fdc = 0;
1203-
wp->w_p_fen = FALSE;
1204-
wp->w_p_fdl = 0;
1236+
if (wp->w_p_fdc == diff_foldcolumn)
1237+
wp->w_p_fdc = wp->w_p_diff_saved ? wp->w_p_fdc_save : 0;
1238+
if (wp->w_p_fen)
1239+
wp->w_p_fen = wp->w_p_diff_saved ? wp->w_p_fen_save : FALSE;
1240+
if (wp->w_p_fdl == 0 && wp->w_p_diff_saved)
1241+
wp->w_p_fdl = wp->w_p_fdl_save;
12051242
foldUpdateAll(wp);
12061243
/* make sure topline is not halfway a fold */
12071244
changed_window_setting_win(wp);
12081245
#endif
1246+
/* Note: 'sbo' is not restored, it's a global option. */
12091247
diff_buf_adjust(wp);
1248+
1249+
wp->w_p_diff_saved = FALSE;
12101250
}
12111251
#ifdef FEAT_SCROLLBIND
12121252
diffwin |= wp->w_p_diff;

src/option.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10118,14 +10118,19 @@ copy_winopt(from, to)
1011810118
to->wo_stl = vim_strsave(from->wo_stl);
1011910119
#endif
1012010120
to->wo_wrap = from->wo_wrap;
10121+
#ifdef FEAT_DIFF
10122+
to->wo_wrap_save = from->wo_wrap_save;
10123+
#endif
1012110124
#ifdef FEAT_LINEBREAK
1012210125
to->wo_lbr = from->wo_lbr;
1012310126
#endif
1012410127
#ifdef FEAT_SCROLLBIND
1012510128
to->wo_scb = from->wo_scb;
10129+
to->wo_scb_save = from->wo_scb_save;
1012610130
#endif
1012710131
#ifdef FEAT_CURSORBIND
1012810132
to->wo_crb = from->wo_crb;
10133+
to->wo_crb_save = from->wo_crb_save;
1012910134
#endif
1013010135
#ifdef FEAT_SPELL
1013110136
to->wo_spell = from->wo_spell;
@@ -10137,18 +10142,24 @@ copy_winopt(from, to)
1013710142
#endif
1013810143
#ifdef FEAT_DIFF
1013910144
to->wo_diff = from->wo_diff;
10145+
to->wo_diff_saved = from->wo_diff_saved;
1014010146
#endif
1014110147
#ifdef FEAT_CONCEAL
1014210148
to->wo_cocu = vim_strsave(from->wo_cocu);
1014310149
to->wo_cole = from->wo_cole;
1014410150
#endif
1014510151
#ifdef FEAT_FOLDING
1014610152
to->wo_fdc = from->wo_fdc;
10153+
to->wo_fdc_save = from->wo_fdc_save;
1014710154
to->wo_fen = from->wo_fen;
10155+
to->wo_fen_save = from->wo_fen_save;
1014810156
to->wo_fdi = vim_strsave(from->wo_fdi);
1014910157
to->wo_fml = from->wo_fml;
1015010158
to->wo_fdl = from->wo_fdl;
10159+
to->wo_fdl_save = from->wo_fdl_save;
1015110160
to->wo_fdm = vim_strsave(from->wo_fdm);
10161+
to->wo_fdm_save = from->wo_diff_saved
10162+
? vim_strsave(from->wo_fdm_save) : empty_option;
1015210163
to->wo_fdn = from->wo_fdn;
1015310164
# ifdef FEAT_EVAL
1015410165
to->wo_fde = vim_strsave(from->wo_fde);
@@ -10180,6 +10191,7 @@ check_winopt(wop)
1018010191
#ifdef FEAT_FOLDING
1018110192
check_string_option(&wop->wo_fdi);
1018210193
check_string_option(&wop->wo_fdm);
10194+
check_string_option(&wop->wo_fdm_save);
1018310195
# ifdef FEAT_EVAL
1018410196
check_string_option(&wop->wo_fde);
1018510197
check_string_option(&wop->wo_fdt);
@@ -10210,6 +10222,7 @@ clear_winopt(wop)
1021010222
#ifdef FEAT_FOLDING
1021110223
clear_string_option(&wop->wo_fdi);
1021210224
clear_string_option(&wop->wo_fdm);
10225+
clear_string_option(&wop->wo_fdm_save);
1021310226
# ifdef FEAT_EVAL
1021410227
clear_string_option(&wop->wo_fde);
1021510228
clear_string_option(&wop->wo_fdt);

src/structs.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,14 +141,22 @@ typedef struct
141141
#ifdef FEAT_FOLDING
142142
long wo_fdc;
143143
# define w_p_fdc w_onebuf_opt.wo_fdc /* 'foldcolumn' */
144+
int wo_fdc_save;
145+
# define w_p_fdc_save w_onebuf_opt.wo_fdc_save /* 'foldenable' saved for diff mode */
144146
int wo_fen;
145147
# define w_p_fen w_onebuf_opt.wo_fen /* 'foldenable' */
148+
int wo_fen_save;
149+
# define w_p_fen_save w_onebuf_opt.wo_fen_save /* 'foldenable' saved for diff mode */
146150
char_u *wo_fdi;
147151
# define w_p_fdi w_onebuf_opt.wo_fdi /* 'foldignore' */
148152
long wo_fdl;
149153
# define w_p_fdl w_onebuf_opt.wo_fdl /* 'foldlevel' */
154+
int wo_fdl_save;
155+
# define w_p_fdl_save w_onebuf_opt.wo_fdl_save /* 'foldlevel' state saved for diff mode */
150156
char_u *wo_fdm;
151157
# define w_p_fdm w_onebuf_opt.wo_fdm /* 'foldmethod' */
158+
char_u *wo_fdm_save;
159+
# define w_p_fdm_save w_onebuf_opt.wo_fdm_save /* 'fdm' saved for diff mode */
152160
long wo_fml;
153161
# define w_p_fml w_onebuf_opt.wo_fml /* 'foldminlines' */
154162
long wo_fdn;
@@ -213,9 +221,17 @@ typedef struct
213221
#ifdef FEAT_SCROLLBIND
214222
int wo_scb;
215223
# define w_p_scb w_onebuf_opt.wo_scb /* 'scrollbind' */
224+
int wo_diff_saved; /* options were saved for starting diff mode */
225+
# define w_p_diff_saved w_onebuf_opt.wo_diff_saved
226+
int wo_scb_save; /* 'scrollbind' saved for diff mode*/
227+
# define w_p_scb_save w_onebuf_opt.wo_scb_save
216228
#endif
217229
int wo_wrap;
218230
#define w_p_wrap w_onebuf_opt.wo_wrap /* 'wrap' */
231+
#ifdef FEAT_DIFF
232+
int wo_wrap_save; /* 'wrap' state saved for diff mode*/
233+
# define w_p_wrap_save w_onebuf_opt.wo_wrap_save
234+
#endif
219235
#ifdef FEAT_CONCEAL
220236
char_u *wo_cocu; /* 'concealcursor' */
221237
# define w_p_cocu w_onebuf_opt.wo_cocu
@@ -225,6 +241,8 @@ typedef struct
225241
#ifdef FEAT_CURSORBIND
226242
int wo_crb;
227243
# define w_p_crb w_onebuf_opt.wo_crb /* 'cursorbind' */
244+
int wo_crb_save; /* 'cursorbind' state saved for diff mode*/
245+
# define w_p_crb_save w_onebuf_opt.wo_crb_save
228246
#endif
229247

230248
#ifdef FEAT_EVAL

src/version.c

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

729729
static int included_patches[] =
730730
{ /* Add new patch number below this line */
731+
/**/
732+
1294,
731733
/**/
732734
1293,
733735
/**/

0 commit comments

Comments
 (0)