vim-patch:8.0.1361: some users don't want to diff with hidden buffers

Problem:    Some users don't want to diff with hidden buffers.
Solution:   Add the "hiddenoff" item to 'diffopt'. (Alisue, closes vim/vim#2394)
97ce419201
This commit is contained in:
Jan Edmund Lazo 2018-08-11 14:55:02 -04:00
parent 90128843f6
commit 594536a1e7
4 changed files with 40 additions and 0 deletions

View File

@ -1960,6 +1960,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 vertical Start diff mode with vertical splits (unless
explicitly specified otherwise). 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 foldcolumn:{n} Set the 'foldcolumn' option to {n} when
starting diff mode. Without this 2 is used. starting diff mode. Without this 2 is used.

View File

@ -509,6 +509,10 @@ void close_buffer(win_T *win, buf_T *buf, int action, int abort_if_last)
if (buf->b_nwindows > 0) if (buf->b_nwindows > 0)
--buf->b_nwindows; --buf->b_nwindows;
if (diffopt_hiddenoff() && !unload_buf && buf->b_nwindows == 0) {
diff_buf_delete(buf); // Clear 'diff' for hidden buffer.
}
/* Return when a window is displaying the buffer or when it's not /* Return when a window is displaying the buffer or when it's not
* unloaded. */ * unloaded. */
if (buf->b_nwindows > 0 || !unload_buf) if (buf->b_nwindows > 0 || !unload_buf)

View File

@ -44,6 +44,7 @@ static int diff_busy = FALSE; // ex_diffgetput() is busy
#define DIFF_IWHITE 4 // ignore change in white space #define DIFF_IWHITE 4 // ignore change in white space
#define DIFF_HORIZONTAL 8 // horizontal splits #define DIFF_HORIZONTAL 8 // horizontal splits
#define DIFF_VERTICAL 16 // vertical splits #define DIFF_VERTICAL 16 // vertical splits
#define DIFF_HIDDEN_OFF 32 // diffoff when hidden
static int diff_flags = DIFF_FILLER; static int diff_flags = DIFF_FILLER;
#define LBUFLEN 50 // length of line in diff file #define LBUFLEN 50 // length of line in diff file
@ -1838,6 +1839,9 @@ int diffopt_changed(void)
} else if ((STRNCMP(p, "foldcolumn:", 11) == 0) && ascii_isdigit(p[11])) { } else if ((STRNCMP(p, "foldcolumn:", 11) == 0) && ascii_isdigit(p[11])) {
p += 11; p += 11;
diff_foldcolumn_new = getdigits_int(&p); diff_foldcolumn_new = getdigits_int(&p);
} else if (STRNCMP(p, "hiddenoff", 9) == 0) {
p += 9;
diff_flags_new |= DIFF_HIDDEN_OFF;
} }
if ((*p != ',') && (*p != NUL)) { if ((*p != ',') && (*p != NUL)) {
@ -1880,6 +1884,12 @@ bool diffopt_horizontal(void)
return (diff_flags & DIFF_HORIZONTAL) != 0; return (diff_flags & DIFF_HORIZONTAL) != 0;
} }
// Return true if 'diffopt' contains "hiddenoff".
bool diffopt_hiddenoff(void)
{
return (diff_flags & DIFF_HIDDEN_OFF) != 0;
}
/// Find the difference within a changed line. /// Find the difference within a changed line.
/// ///
/// @param wp window whose current buffer to check /// @param wp window whose current buffer to check

View File

@ -375,6 +375,29 @@ func Test_diffopt_vertical()
%bwipe %bwipe
endfunc 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() func Test_diffoff_hidden()
set diffopt=filler,foldcolumn:0 set diffopt=filler,foldcolumn:0
e! one e! one