comparison src/diff.c @ 6897:d3a23af4bba1 v7.4.768

patch 7.4.768 Problem: :diffoff only works properly once. Solution: Also make :diffoff work when used a second time. (Olaf Dabrunz)
author Bram Moolenaar <bram@vim.org>
date Fri, 03 Jul 2015 15:06:56 +0200
parents 7347229a646a
children a07c3f9cd616
comparison
equal deleted inserted replaced
6896:026862df2f7b 6897:d3a23af4bba1
1136 curwin = wp; 1136 curwin = wp;
1137 newFoldLevel(); 1137 newFoldLevel();
1138 curwin = old_curwin; 1138 curwin = old_curwin;
1139 # endif 1139 # endif
1140 1140
1141 wp->w_p_diff = TRUE;
1142
1143 /* Use 'scrollbind' and 'cursorbind' when available */ 1141 /* Use 'scrollbind' and 'cursorbind' when available */
1144 #ifdef FEAT_SCROLLBIND 1142 #ifdef FEAT_SCROLLBIND
1145 if (!wp->w_p_diff_saved) 1143 if (!wp->w_p_diff)
1146 wp->w_p_scb_save = wp->w_p_scb; 1144 wp->w_p_scb_save = wp->w_p_scb;
1147 wp->w_p_scb = TRUE; 1145 wp->w_p_scb = TRUE;
1148 #endif 1146 #endif
1149 #ifdef FEAT_CURSORBIND 1147 #ifdef FEAT_CURSORBIND
1150 if (!wp->w_p_diff_saved) 1148 if (!wp->w_p_diff)
1151 wp->w_p_crb_save = wp->w_p_crb; 1149 wp->w_p_crb_save = wp->w_p_crb;
1152 wp->w_p_crb = TRUE; 1150 wp->w_p_crb = TRUE;
1153 #endif 1151 #endif
1154 if (!wp->w_p_diff_saved) 1152 if (!wp->w_p_diff)
1155 wp->w_p_wrap_save = wp->w_p_wrap; 1153 wp->w_p_wrap_save = wp->w_p_wrap;
1156 wp->w_p_wrap = FALSE; 1154 wp->w_p_wrap = FALSE;
1157 # ifdef FEAT_FOLDING 1155 # ifdef FEAT_FOLDING
1158 curwin = wp; 1156 curwin = wp;
1159 curbuf = curwin->w_buffer; 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 wp->w_p_fdm_save = vim_strsave(wp->w_p_fdm); 1162 wp->w_p_fdm_save = vim_strsave(wp->w_p_fdm);
1163 }
1162 set_string_option_direct((char_u *)"fdm", -1, (char_u *)"diff", 1164 set_string_option_direct((char_u *)"fdm", -1, (char_u *)"diff",
1163 OPT_LOCAL|OPT_FREE, 0); 1165 OPT_LOCAL|OPT_FREE, 0);
1164 curwin = old_curwin; 1166 curwin = old_curwin;
1165 curbuf = curwin->w_buffer; 1167 curbuf = curwin->w_buffer;
1166 if (!wp->w_p_diff_saved) 1168 if (!wp->w_p_diff)
1167 { 1169 {
1168 wp->w_p_fdc_save = wp->w_p_fdc; 1170 wp->w_p_fdc_save = wp->w_p_fdc;
1169 wp->w_p_fen_save = wp->w_p_fen; 1171 wp->w_p_fen_save = wp->w_p_fen;
1170 wp->w_p_fdl_save = wp->w_p_fdl; 1172 wp->w_p_fdl_save = wp->w_p_fdl;
1171 } 1173 }
1181 do_cmdline_cmd((char_u *)"set sbo+=hor"); 1183 do_cmdline_cmd((char_u *)"set sbo+=hor");
1182 #endif 1184 #endif
1183 /* Saved the current values, to be restored in ex_diffoff(). */ 1185 /* Saved the current values, to be restored in ex_diffoff(). */
1184 wp->w_p_diff_saved = TRUE; 1186 wp->w_p_diff_saved = TRUE;
1185 1187
1188 wp->w_p_diff = TRUE;
1189
1186 if (addbuf) 1190 if (addbuf)
1187 diff_buf_add(wp->w_buffer); 1191 diff_buf_add(wp->w_buffer);
1188 redraw_win_later(wp, NOT_VALID); 1192 redraw_win_later(wp, NOT_VALID);
1189 } 1193 }
1190 1194
1195 void 1199 void
1196 ex_diffoff(eap) 1200 ex_diffoff(eap)
1197 exarg_T *eap; 1201 exarg_T *eap;
1198 { 1202 {
1199 win_T *wp; 1203 win_T *wp;
1200 win_T *old_curwin = curwin;
1201 #ifdef FEAT_SCROLLBIND 1204 #ifdef FEAT_SCROLLBIND
1202 int diffwin = FALSE; 1205 int diffwin = FALSE;
1203 #endif 1206 #endif
1204 1207
1205 for (wp = firstwin; wp != NULL; wp = wp->w_next) 1208 for (wp = firstwin; wp != NULL; wp = wp->w_next)
1206 { 1209 {
1207 if (eap->forceit ? wp->w_p_diff : wp == curwin) 1210 if (eap->forceit ? wp->w_p_diff : wp == curwin)
1208 { 1211 {
1209 /* Set 'diff', 'scrollbind' off and 'wrap' on. If option values 1212 /* Set 'diff' off. If option values were saved in
1210 * were saved in diff_win_options() restore them. */ 1213 * diff_win_options(), restore the ones whose settings seem to have
1214 * been left over from diff mode. */
1211 wp->w_p_diff = FALSE; 1215 wp->w_p_diff = FALSE;
1212 1216
1217 if (wp->w_p_diff_saved)
1218 {
1219
1213 #ifdef FEAT_SCROLLBIND 1220 #ifdef FEAT_SCROLLBIND
1214 if (wp->w_p_scb) 1221 if (wp->w_p_scb)
1215 wp->w_p_scb = wp->w_p_diff_saved ? wp->w_p_scb_save : FALSE; 1222 wp->w_p_scb = wp->w_p_scb_save;
1216 #endif 1223 #endif
1217 #ifdef FEAT_CURSORBIND 1224 #ifdef FEAT_CURSORBIND
1218 if (wp->w_p_crb) 1225 if (wp->w_p_crb)
1219 wp->w_p_crb = wp->w_p_diff_saved ? wp->w_p_crb_save : FALSE; 1226 wp->w_p_crb = wp->w_p_crb_save;
1220 #endif 1227 #endif
1221 if (!wp->w_p_wrap) 1228 if (!wp->w_p_wrap)
1222 wp->w_p_wrap = wp->w_p_diff_saved ? wp->w_p_wrap_save : TRUE; 1229 wp->w_p_wrap = wp->w_p_wrap_save;
1223 #ifdef FEAT_FOLDING 1230 #ifdef FEAT_FOLDING
1224 curwin = wp;
1225 curbuf = curwin->w_buffer;
1226 if (wp->w_p_diff_saved)
1227 {
1228 free_string_option(wp->w_p_fdm); 1231 free_string_option(wp->w_p_fdm);
1229 wp->w_p_fdm = wp->w_p_fdm_save; 1232 wp->w_p_fdm = vim_strsave(wp->w_p_fdm_save);
1230 wp->w_p_fdm_save = empty_option; 1233
1231 } 1234 if (wp->w_p_fdc == diff_foldcolumn)
1232 else 1235 wp->w_p_fdc = wp->w_p_fdc_save;
1233 set_string_option_direct((char_u *)"fdm", -1, 1236 if (wp->w_p_fdl == 0)
1234 (char_u *)"manual", OPT_LOCAL|OPT_FREE, 0); 1237 wp->w_p_fdl = wp->w_p_fdl_save;
1235 curwin = old_curwin; 1238
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 {
1244 /* Only restore 'foldenable' when 'foldmethod' is not 1239 /* Only restore 'foldenable' when 'foldmethod' is not
1245 * "manual", otherwise we continue to show the diff folds. */ 1240 * "manual", otherwise we continue to show the diff folds. */
1246 if (foldmethodIsManual(wp) || !wp->w_p_diff_saved) 1241 if (wp->w_p_fen)
1247 wp->w_p_fen = FALSE; 1242 wp->w_p_fen = foldmethodIsManual(wp) ? FALSE
1248 else 1243 : wp->w_p_fen_save;
1249 wp->w_p_fen = wp->w_p_fen_save; 1244
1250 } 1245 foldUpdateAll(wp);
1251 1246 /* make sure topline is not halfway a fold */
1252 foldUpdateAll(wp); 1247 changed_window_setting_win(wp);
1253 /* make sure topline is not halfway a fold */ 1248 #endif
1254 changed_window_setting_win(wp); 1249 }
1255 #endif 1250
1256 /* Note: 'sbo' is not restored, it's a global option. */ 1251 /* Note: 'sbo' is not restored, it's a global option. */
1257 diff_buf_adjust(wp); 1252 diff_buf_adjust(wp);
1258
1259 wp->w_p_diff_saved = FALSE;
1260 } 1253 }
1261 #ifdef FEAT_SCROLLBIND 1254 #ifdef FEAT_SCROLLBIND
1262 diffwin |= wp->w_p_diff; 1255 diffwin |= wp->w_p_diff;
1263 #endif 1256 #endif
1264 } 1257 }