diff options
author | Bram Moolenaar <Bram@vim.org> | 2013-07-03 15:47:03 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2013-07-03 15:47:03 +0200 |
commit | a87aa8061ce670c38d742b0f7e41cc950d10320f (patch) | |
tree | 8492ac8cbe062fe609e3c0d1588af8350ccc454a /src/diff.c | |
parent | caf2dffd5142f93c75367e3af99e52df7abf73cd (diff) | |
download | vim-git-a87aa8061ce670c38d742b0f7e41cc950d10320f.tar.gz |
updated for version 7.3.1294v7.3.1294
Problem: ":diffoff" resets options.
Solution: Save and restore option values. (Christian Brabandt)
Diffstat (limited to 'src/diff.c')
-rw-r--r-- | src/diff.c | 54 |
1 files changed, 47 insertions, 7 deletions
diff --git a/src/diff.c b/src/diff.c index cf091408d..92648a361 100644 --- a/src/diff.c +++ b/src/diff.c @@ -1138,21 +1138,36 @@ diff_win_options(wp, addbuf) # endif wp->w_p_diff = TRUE; + /* Use 'scrollbind' and 'cursorbind' when available */ #ifdef FEAT_SCROLLBIND + if (!wp->w_p_diff_saved) + wp->w_p_scb_save = wp->w_p_scb; wp->w_p_scb = TRUE; #endif #ifdef FEAT_CURSORBIND + if (!wp->w_p_diff_saved) + wp->w_p_crb_save = wp->w_p_crb; wp->w_p_crb = TRUE; #endif + if (!wp->w_p_diff_saved) + 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) + 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) + { + wp->w_p_fdc_save = wp->w_p_fdc; + wp->w_p_fen_save = wp->w_p_fen; + wp->w_p_fdl_save = wp->w_p_fdl; + } wp->w_p_fdc = diff_foldcolumn; wp->w_p_fen = TRUE; wp->w_p_fdl = 0; @@ -1164,6 +1179,8 @@ diff_win_options(wp, addbuf) if (vim_strchr(p_sbo, 'h') == NULL) do_cmdline_cmd((char_u *)"set sbo+=hor"); #endif + /* Saved the current values, to be restored in ex_diffoff(). */ + wp->w_p_diff_saved = TRUE; if (addbuf) diff_buf_add(wp->w_buffer); @@ -1188,25 +1205,48 @@ ex_diffoff(eap) { if (wp == curwin || (eap->forceit && wp->w_p_diff)) { - /* Set 'diff', 'scrollbind' off and 'wrap' on. */ + /* Set 'diff', 'scrollbind' off and 'wrap' on. If option values + * were saved in diff_win_options() restore them. */ wp->w_p_diff = FALSE; - RESET_BINDING(wp); - wp->w_p_wrap = TRUE; + +#ifdef FEAT_SCROLLBIND + if (wp->w_p_scb) + wp->w_p_scb = wp->w_p_diff_saved ? wp->w_p_scb_save : FALSE; +#endif +#ifdef FEAT_CURSORBIND + if (wp->w_p_crb) + wp->w_p_crb = wp->w_p_diff_saved ? wp->w_p_crb_save : FALSE; +#endif + if (!wp->w_p_wrap) + wp->w_p_wrap = wp->w_p_diff_saved ? wp->w_p_wrap_save : TRUE; #ifdef FEAT_FOLDING curwin = wp; curbuf = curwin->w_buffer; - set_string_option_direct((char_u *)"fdm", -1, + 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; - wp->w_p_fdc = 0; - wp->w_p_fen = FALSE; - wp->w_p_fdl = 0; + 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_fen) + wp->w_p_fen = wp->w_p_diff_saved ? wp->w_p_fen_save : FALSE; + if (wp->w_p_fdl == 0 && wp->w_p_diff_saved) + wp->w_p_fdl = wp->w_p_fdl_save; 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; |