@@ -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 ;
0 commit comments