@@ -1138,32 +1138,34 @@ diff_win_options(wp, addbuf)
1138
1138
curwin = old_curwin ;
1139
1139
# endif
1140
1140
1141
- wp -> w_p_diff = TRUE;
1142
-
1143
1141
/* Use 'scrollbind' and 'cursorbind' when available */
1144
1142
#ifdef FEAT_SCROLLBIND
1145
- if (!wp -> w_p_diff_saved )
1143
+ if (!wp -> w_p_diff )
1146
1144
wp -> w_p_scb_save = wp -> w_p_scb ;
1147
1145
wp -> w_p_scb = TRUE;
1148
1146
#endif
1149
1147
#ifdef FEAT_CURSORBIND
1150
- if (!wp -> w_p_diff_saved )
1148
+ if (!wp -> w_p_diff )
1151
1149
wp -> w_p_crb_save = wp -> w_p_crb ;
1152
1150
wp -> w_p_crb = TRUE;
1153
1151
#endif
1154
- if (!wp -> w_p_diff_saved )
1152
+ if (!wp -> w_p_diff )
1155
1153
wp -> w_p_wrap_save = wp -> w_p_wrap ;
1156
1154
wp -> w_p_wrap = FALSE;
1157
1155
# ifdef FEAT_FOLDING
1158
1156
curwin = wp ;
1159
1157
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 );
1161
1162
wp -> w_p_fdm_save = vim_strsave (wp -> w_p_fdm );
1163
+ }
1162
1164
set_string_option_direct ((char_u * )"fdm" , -1 , (char_u * )"diff" ,
1163
1165
OPT_LOCAL |OPT_FREE , 0 );
1164
1166
curwin = old_curwin ;
1165
1167
curbuf = curwin -> w_buffer ;
1166
- if (!wp -> w_p_diff_saved )
1168
+ if (!wp -> w_p_diff )
1167
1169
{
1168
1170
wp -> w_p_fdc_save = wp -> w_p_fdc ;
1169
1171
wp -> w_p_fen_save = wp -> w_p_fen ;
@@ -1183,6 +1185,8 @@ diff_win_options(wp, addbuf)
1183
1185
/* Saved the current values, to be restored in ex_diffoff(). */
1184
1186
wp -> w_p_diff_saved = TRUE;
1185
1187
1188
+ wp -> w_p_diff = TRUE;
1189
+
1186
1190
if (addbuf )
1187
1191
diff_buf_add (wp -> w_buffer );
1188
1192
redraw_win_later (wp , NOT_VALID );
@@ -1197,7 +1201,6 @@ ex_diffoff(eap)
1197
1201
exarg_T * eap ;
1198
1202
{
1199
1203
win_T * wp ;
1200
- win_T * old_curwin = curwin ;
1201
1204
#ifdef FEAT_SCROLLBIND
1202
1205
int diffwin = FALSE;
1203
1206
#endif
@@ -1206,57 +1209,47 @@ ex_diffoff(eap)
1206
1209
{
1207
1210
if (eap -> forceit ? wp -> w_p_diff : wp == curwin )
1208
1211
{
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. */
1211
1215
wp -> w_p_diff = FALSE;
1212
1216
1217
+ if (wp -> w_p_diff_saved )
1218
+ {
1219
+
1213
1220
#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 ;
1216
1223
#endif
1217
1224
#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 ;
1220
1227
#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 ;
1223
1230
#ifdef FEAT_FOLDING
1224
- curwin = wp ;
1225
- curbuf = curwin -> w_buffer ;
1226
- if (wp -> w_p_diff_saved )
1227
- {
1228
1231
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
+
1244
1239
/* Only restore 'foldenable' when 'foldmethod' is not
1245
1240
* "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 ;
1251
1244
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 );
1255
1248
#endif
1249
+ }
1250
+
1256
1251
/* Note: 'sbo' is not restored, it's a global option. */
1257
1252
diff_buf_adjust (wp );
1258
-
1259
- wp -> w_p_diff_saved = FALSE;
1260
1253
}
1261
1254
#ifdef FEAT_SCROLLBIND
1262
1255
diffwin |= wp -> w_p_diff ;
0 commit comments