Mercurial > vim
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 } |