summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <bram@vim.org>2015-07-03 15:06:56 +0200
committerBram Moolenaar <bram@vim.org>2015-07-03 15:06:56 +0200
commit4fd3a09aa0e30b35b41ade3658b6dd7931c353b2 (patch)
treeafffdbe99f2728f0b6c819873f7e0c6573c74869
parent363afae6112021eb4dd9b35faa34e1c2d95b01ab (diff)
downloadvim-4fd3a09aa0e30b35b41ade3658b6dd7931c353b2.tar.gz
patch 7.4.768v7.4.768v7-4-768
Problem: :diffoff only works properly once. Solution: Also make :diffoff work when used a second time. (Olaf Dabrunz)
-rw-r--r--src/diff.c83
-rw-r--r--src/version.c2
2 files changed, 40 insertions, 45 deletions
diff --git a/src/diff.c b/src/diff.c
index aec54c2b..ef59e443 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -1138,32 +1138,34 @@ diff_win_options(wp, addbuf)
curwin = old_curwin;
# endif
- wp->w_p_diff = TRUE;
-
/* Use 'scrollbind' and 'cursorbind' when available */
#ifdef FEAT_SCROLLBIND
- if (!wp->w_p_diff_saved)
+ if (!wp->w_p_diff)
wp->w_p_scb_save = wp->w_p_scb;
wp->w_p_scb = TRUE;
#endif
#ifdef FEAT_CURSORBIND
- if (!wp->w_p_diff_saved)
+ if (!wp->w_p_diff)
wp->w_p_crb_save = wp->w_p_crb;
wp->w_p_crb = TRUE;
#endif
- if (!wp->w_p_diff_saved)
+ if (!wp->w_p_diff)
wp->w_p_wrap_save = wp->w_p_wrap;
wp->w_p_wrap = FALSE;
# ifdef FEAT_FOLDING
curwin = wp;
curbuf = curwin->w_buffer;
- if (!wp->w_p_diff_saved)
+ if (!wp->w_p_diff)
+ {
+ if (wp->w_p_diff_saved)
+ free_string_option(wp->w_p_fdm_save);
wp->w_p_fdm_save = vim_strsave(wp->w_p_fdm);
+ }
set_string_option_direct((char_u *)"fdm", -1, (char_u *)"diff",
OPT_LOCAL|OPT_FREE, 0);
curwin = old_curwin;
curbuf = curwin->w_buffer;
- if (!wp->w_p_diff_saved)
+ if (!wp->w_p_diff)
{
wp->w_p_fdc_save = wp->w_p_fdc;
wp->w_p_fen_save = wp->w_p_fen;
@@ -1183,6 +1185,8 @@ diff_win_options(wp, addbuf)
/* Saved the current values, to be restored in ex_diffoff(). */
wp->w_p_diff_saved = TRUE;
+ wp->w_p_diff = TRUE;
+
if (addbuf)
diff_buf_add(wp->w_buffer);
redraw_win_later(wp, NOT_VALID);
@@ -1197,7 +1201,6 @@ ex_diffoff(eap)
exarg_T *eap;
{
win_T *wp;
- win_T *old_curwin = curwin;
#ifdef FEAT_SCROLLBIND
int diffwin = FALSE;
#endif
@@ -1206,57 +1209,47 @@ ex_diffoff(eap)
{
if (eap->forceit ? wp->w_p_diff : wp == curwin)
{
- /* Set 'diff', 'scrollbind' off and 'wrap' on. If option values
- * were saved in diff_win_options() restore them. */
+ /* Set 'diff' off. If option values were saved in
+ * diff_win_options(), restore the ones whose settings seem to have
+ * been left over from diff mode. */
wp->w_p_diff = FALSE;
+ if (wp->w_p_diff_saved)
+ {
+
#ifdef FEAT_SCROLLBIND
- if (wp->w_p_scb)
- wp->w_p_scb = wp->w_p_diff_saved ? wp->w_p_scb_save : FALSE;
+ if (wp->w_p_scb)
+ wp->w_p_scb = wp->w_p_scb_save;
#endif
#ifdef FEAT_CURSORBIND
- if (wp->w_p_crb)
- wp->w_p_crb = wp->w_p_diff_saved ? wp->w_p_crb_save : FALSE;
+ if (wp->w_p_crb)
+ wp->w_p_crb = wp->w_p_crb_save;
#endif
- if (!wp->w_p_wrap)
- wp->w_p_wrap = wp->w_p_diff_saved ? wp->w_p_wrap_save : TRUE;
+ if (!wp->w_p_wrap)
+ wp->w_p_wrap = wp->w_p_wrap_save;
#ifdef FEAT_FOLDING
- curwin = wp;
- curbuf = curwin->w_buffer;
- if (wp->w_p_diff_saved)
- {
free_string_option(wp->w_p_fdm);
- wp->w_p_fdm = wp->w_p_fdm_save;
- wp->w_p_fdm_save = empty_option;
- }
- else
- set_string_option_direct((char_u *)"fdm", -1,
- (char_u *)"manual", OPT_LOCAL|OPT_FREE, 0);
- curwin = old_curwin;
- curbuf = curwin->w_buffer;
- if (wp->w_p_fdc == diff_foldcolumn)
- wp->w_p_fdc = wp->w_p_diff_saved ? wp->w_p_fdc_save : 0;
- if (wp->w_p_fdl == 0 && wp->w_p_diff_saved)
- wp->w_p_fdl = wp->w_p_fdl_save;
-
- if (wp->w_p_fen)
- {
+ wp->w_p_fdm = vim_strsave(wp->w_p_fdm_save);
+
+ if (wp->w_p_fdc == diff_foldcolumn)
+ wp->w_p_fdc = wp->w_p_fdc_save;
+ if (wp->w_p_fdl == 0)
+ wp->w_p_fdl = wp->w_p_fdl_save;
+
/* Only restore 'foldenable' when 'foldmethod' is not
* "manual", otherwise we continue to show the diff folds. */
- if (foldmethodIsManual(wp) || !wp->w_p_diff_saved)
- wp->w_p_fen = FALSE;
- else
- wp->w_p_fen = wp->w_p_fen_save;
- }
+ if (wp->w_p_fen)
+ wp->w_p_fen = foldmethodIsManual(wp) ? FALSE
+ : wp->w_p_fen_save;
- foldUpdateAll(wp);
- /* make sure topline is not halfway a fold */
- changed_window_setting_win(wp);
+ foldUpdateAll(wp);
+ /* make sure topline is not halfway a fold */
+ changed_window_setting_win(wp);
#endif
+ }
+
/* Note: 'sbo' is not restored, it's a global option. */
diff_buf_adjust(wp);
-
- wp->w_p_diff_saved = FALSE;
}
#ifdef FEAT_SCROLLBIND
diffwin |= wp->w_p_diff;
diff --git a/src/version.c b/src/version.c
index 709bf99a..047fd122 100644
--- a/src/version.c
+++ b/src/version.c
@@ -742,6 +742,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 768,
+/**/
767,
/**/
766,