summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-02-10 13:18:17 +0100
committerBram Moolenaar <Bram@vim.org>2021-02-10 13:18:17 +0100
commit4223d43c0fb6ead1e611e4469a1680a9228b6015 (patch)
tree0eb28a94ec186e4f0306f6aaae79743bd6e9b99d
parent963ffa0a5a6091655ed72b4590ec5d5a1653bce8 (diff)
downloadvim-git-4223d43c0fb6ead1e611e4469a1680a9228b6015.tar.gz
patch 8.2.2490: 'wrap' option is always reset when starting diff modev8.2.2490
Problem: 'wrap' option is always reset when starting diff mode. Solution: Add the "followwrap" item in 'diffopt'. (Rick Howe, closes #7797)
-rw-r--r--runtime/doc/diff.txt4
-rw-r--r--runtime/doc/options.txt2
-rw-r--r--src/diff.c22
-rw-r--r--src/testdir/test_diffmode.vim15
-rw-r--r--src/version.c2
5 files changed, 38 insertions, 7 deletions
diff --git a/runtime/doc/diff.txt b/runtime/doc/diff.txt
index 0b4edb927..566411a1f 100644
--- a/runtime/doc/diff.txt
+++ b/runtime/doc/diff.txt
@@ -59,7 +59,7 @@ In each of the edited files these options are set:
'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 value:
'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
index 74bab429c..f25b1ba97 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -2677,6 +2677,8 @@ A jump table for the options with a short description can be found at |Q_op|.
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
index 753d089b6..0a0594cfe 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -36,6 +36,7 @@ static int diff_need_update = FALSE; // ex_diffupdate needs to be called
#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
index 2d6228a44..d09d74149 100644
--- 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
index 18f0b840f..382b923a9 100644
--- 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,