# HG changeset patch # User Bram Moolenaar # Date 1612960203 -3600 # Node ID e313b6ee2d9ceb7ce587831cd547150f519e1064 # Parent 54300725297422bf4f4ecd7ccef14bcdc3a53c32 patch 8.2.2490: 'wrap' option is always reset when starting diff mode Commit: https://github.com/vim/vim/commit/4223d43c0fb6ead1e611e4469a1680a9228b6015 Author: Bram Moolenaar Date: Wed Feb 10 13:18:17 2021 +0100 patch 8.2.2490: 'wrap' option is always reset when starting diff mode Problem: 'wrap' option is always reset when starting diff mode. Solution: Add the "followwrap" item in 'diffopt'. (Rick Howe, closes https://github.com/vim/vim/issues/7797) diff --git a/runtime/doc/diff.txt b/runtime/doc/diff.txt --- a/runtime/doc/diff.txt +++ b/runtime/doc/diff.txt @@ -59,7 +59,7 @@ In each of the edited files these option 'scrollbind' on 'cursorbind' on 'scrollopt' includes "hor" - 'wrap' off + 'wrap' off, or leave as-is if 'diffopt' includes "followwrap" 'foldmethod' "diff" 'foldcolumn' value from 'diffopt', default is 2 @@ -144,7 +144,7 @@ Otherwise they are set to their default 'scrollbind' off 'cursorbind' off 'scrollopt' without "hor" - 'wrap' on + 'wrap' on, or leave as-is if 'diffopt' includes "followwrap" 'foldmethod' "manual" 'foldcolumn' 0 diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -2677,6 +2677,8 @@ A jump table for the options with a shor foldcolumn:{n} Set the 'foldcolumn' option to {n} when starting diff mode. Without this 2 is used. + followwrap Follow the 'wrap' option and leave as it is. + internal Use the internal diff library. This is ignored when 'diffexpr' is set. *E960* When running out of memory when writing a diff --git a/src/diff.c b/src/diff.c --- a/src/diff.c +++ b/src/diff.c @@ -36,6 +36,7 @@ static int diff_need_update = FALSE; // #define DIFF_HIDDEN_OFF 0x100 // diffoff when hidden #define DIFF_INTERNAL 0x200 // use internal xdiff algorithm #define DIFF_CLOSE_OFF 0x400 // diffoff when closing window +#define DIFF_FOLLOWWRAP 0x800 // follow the wrap option #define ALL_WHITE_DIFF (DIFF_IWHITE | DIFF_IWHITEALL | DIFF_IWHITEEOL) static int diff_flags = DIFF_INTERNAL | DIFF_FILLER | DIFF_CLOSE_OFF; @@ -1454,9 +1455,12 @@ diff_win_options( if (!wp->w_p_diff) wp->w_p_crb_save = wp->w_p_crb; wp->w_p_crb = TRUE; - if (!wp->w_p_diff) - wp->w_p_wrap_save = wp->w_p_wrap; - wp->w_p_wrap = FALSE; + if (!(diff_flags & DIFF_FOLLOWWRAP)) + { + if (!wp->w_p_diff) + wp->w_p_wrap_save = wp->w_p_wrap; + wp->w_p_wrap = FALSE; + } # ifdef FEAT_FOLDING if (!wp->w_p_diff) { @@ -1517,8 +1521,11 @@ ex_diffoff(exarg_T *eap) wp->w_p_scb = wp->w_p_scb_save; if (wp->w_p_crb) wp->w_p_crb = wp->w_p_crb_save; - if (!wp->w_p_wrap) - wp->w_p_wrap = wp->w_p_wrap_save; + if (!(diff_flags & DIFF_FOLLOWWRAP)) + { + if (!wp->w_p_wrap) + wp->w_p_wrap = wp->w_p_wrap_save; + } #ifdef FEAT_FOLDING free_string_option(wp->w_p_fdm); wp->w_p_fdm = vim_strsave( @@ -2245,6 +2252,11 @@ diffopt_changed(void) p += 8; diff_flags_new |= DIFF_CLOSE_OFF; } + else if (STRNCMP(p, "followwrap", 10) == 0) + { + p += 10; + diff_flags_new |= DIFF_FOLLOWWRAP; + } else if (STRNCMP(p, "indent-heuristic", 16) == 0) { p += 16; diff --git a/src/testdir/test_diffmode.vim b/src/testdir/test_diffmode.vim --- a/src/testdir/test_diffmode.vim +++ b/src/testdir/test_diffmode.vim @@ -1045,6 +1045,21 @@ func Test_diff_closeoff() enew! endfunc +func Test_diff_followwrap() + new + set diffopt+=followwrap + set wrap + diffthis + call assert_equal(1, &wrap) + diffoff + set nowrap + diffthis + call assert_equal(0, &wrap) + diffoff + set diffopt& + bwipe! +endfunc + func Test_diff_maintains_change_mark() enew! call setline(1, ['a', 'b', 'c', 'd']) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2490, +/**/ 2489, /**/ 2488,