]> granicus.if.org Git - vim/commitdiff
patch 8.0.1361: some users don't want to diff with hidden buffers v8.0.1361
authorBram Moolenaar <Bram@vim.org>
Fri, 1 Dec 2017 19:35:58 +0000 (20:35 +0100)
committerBram Moolenaar <Bram@vim.org>
Fri, 1 Dec 2017 19:35:58 +0000 (20:35 +0100)
Problem:    Some users don't want to diff with hidden buffers.
Solution:   Add the "hiddenoff" item to 'diffopt'. (Alisue, closes #2394)

runtime/doc/options.txt
src/buffer.c
src/diff.c
src/proto/diff.pro
src/testdir/test_diffmode.vim
src/version.c

index 5df5f30a368a4328643e3c670330e63ff47d971a..08bc78dcf48a9c8f3630f184db497d2cdcf55c91 100644 (file)
@@ -2634,6 +2634,9 @@ A jump table for the options with a short description can be found at |Q_op|.
                vertical        Start diff mode with vertical splits (unless
                                explicitly specified otherwise).
 
+               hiddenoff       Do not use diff mode for a buffer when it
+                               becomes hidden.
+
                foldcolumn:{n}  Set the 'foldcolumn' option to {n} when
                                starting diff mode.  Without this 2 is used.
 
index dad910388b73ec36b6cf811ab42acea4994b6bb2..ed5773e882d3e28d93fc26b4b0a1aab3874c1ae6 100644 (file)
@@ -593,6 +593,11 @@ aucmd_abort:
     if (buf->b_nwindows > 0)
        --buf->b_nwindows;
 
+#ifdef FEAT_DIFF
+    if (diffopt_hiddenoff() && !unload_buf && buf->b_nwindows == 0)
+       diff_buf_delete(buf);   /* Clear 'diff' for hidden buffer. */
+#endif
+
     /* Return when a window is displaying the buffer or when it's not
      * unloaded. */
     if (buf->b_nwindows > 0 || !unload_buf)
index 11952c7433b1a974930932bd52a1c986969e4d36..2f5b38c7b329bf44286da05d9f516c68d98d274c 100644 (file)
@@ -23,6 +23,7 @@ static int    diff_busy = FALSE;      /* ex_diffgetput() is busy */
 #define DIFF_IWHITE    4       /* ignore change in white space */
 #define DIFF_HORIZONTAL        8       /* horizontal splits */
 #define DIFF_VERTICAL  16      /* vertical splits */
+#define DIFF_HIDDEN_OFF        32      /* diffoff when hidden */
 static int     diff_flags = DIFF_FILLER;
 
 #define LBUFLEN 50             /* length of line in diff file */
@@ -1924,6 +1925,11 @@ diffopt_changed(void)
            p += 11;
            diff_foldcolumn_new = getdigits(&p);
        }
+       else if (STRNCMP(p, "hiddenoff", 9) == 0)
+       {
+           p += 9;
+           diff_flags_new |= DIFF_HIDDEN_OFF;
+       }
        if (*p != ',' && *p != NUL)
            return FAIL;
        if (*p == ',')
@@ -1961,6 +1967,15 @@ diffopt_horizontal(void)
     return (diff_flags & DIFF_HORIZONTAL) != 0;
 }
 
+/*
+ * Return TRUE if 'diffopt' contains "hiddenoff".
+ */
+    int
+diffopt_hiddenoff(void)
+{
+    return (diff_flags & DIFF_HIDDEN_OFF) != 0;
+}
+
 /*
  * Find the difference within a changed line.
  * Returns TRUE if the line was added, no other buffer has it.
index 718640152ffb0650450783ae67f6fed727d3a7cd..f1afeecec8b495d685be071369e4a74b073255a2 100644 (file)
@@ -16,6 +16,7 @@ int diff_check_fill(win_T *wp, linenr_T lnum);
 void diff_set_topline(win_T *fromwin, win_T *towin);
 int diffopt_changed(void);
 int diffopt_horizontal(void);
+int diffopt_hiddenoff(void);
 int diff_find_change(win_T *wp, linenr_T lnum, int *startp, int *endp);
 int diff_infold(win_T *wp, linenr_T lnum);
 void nv_diffgetput(int put, long count);
index 3273dcbd5fdc59795f5fbfee9a2f3fbb03babc88..d6c5c83fe566e5b17caa48efd47827fb32e3a323 100644 (file)
@@ -375,6 +375,29 @@ func Test_diffopt_vertical()
   %bwipe
 endfunc
 
+func Test_diffopt_hiddenoff()
+  set diffopt=filler,foldcolumn:0,hiddenoff
+  e! one
+  call setline(1, ['Two', 'Three'])
+  redraw
+  let normattr = screenattr(1, 1)
+  diffthis
+  botright vert new two
+  call setline(1, ['One', 'Four'])
+  diffthis
+  redraw
+  call assert_notequal(normattr, screenattr(1, 1))
+  set hidden
+  close
+  redraw
+  " should not diffing with hidden buffer two while 'hiddenoff' is enabled
+  call assert_equal(normattr, screenattr(1, 1))
+
+  bwipe!
+  bwipe!
+  set hidden& diffopt&
+endfunc
+
 func Test_diffoff_hidden()
   set diffopt=filler,foldcolumn:0
   e! one
index ece615ca585cc91802a7e2d66677a2ff6a55120e..604fa41987955c36c627636a667846be7dc76531 100644 (file)
@@ -771,6 +771,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1361,
 /**/
     1360,
 /**/