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