Merge #11406 from janlazo/vim-8.1.1922

vim-patch:8.1.{1922,2289,2305}
This commit is contained in:
Justin M. Keyes 2019-11-16 18:43:03 -08:00 committed by GitHub
commit a45890e82e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 103 additions and 11 deletions

View File

@ -1875,7 +1875,7 @@ A jump table for the options with a short description can be found at |Q_op|.
security reasons.
*'dip'* *'diffopt'*
'diffopt' 'dip' string (default "internal,filler")
'diffopt' 'dip' string (default "internal,filler,closeoff")
global
Option settings for diff mode. It can consist of the following items.
All are optional. Items must be separated by a comma.
@ -1932,6 +1932,12 @@ 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).
closeoff When a window is closed where 'diff' is set
and there is only one window remaining in the
same tab page with 'diff' set, execute
`:diffoff` in that window. This undoes a
`:diffsplit` command.
hiddenoff Do not use diff mode for a buffer when it
becomes hidden.

View File

@ -44,7 +44,7 @@
#include "nvim/os/shell.h"
static int diff_busy = false; // using diff structs, don't change them
static int diff_need_update = false; // ex_diffupdate needs to be called
static bool diff_need_update = false; // ex_diffupdate needs to be called
// Flags obtained from the 'diffopt' option
#define DIFF_FILLER 0x001 // display filler lines
@ -57,8 +57,9 @@ static int diff_need_update = false; // ex_diffupdate needs to be called
#define DIFF_VERTICAL 0x080 // vertical splits
#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 ALL_WHITE_DIFF (DIFF_IWHITE | DIFF_IWHITEALL | DIFF_IWHITEEOL)
static int diff_flags = DIFF_INTERNAL | DIFF_FILLER;
static int diff_flags = DIFF_INTERNAL | DIFF_FILLER | DIFF_CLOSE_OFF;
static long diff_algorithm = 0;
@ -490,7 +491,8 @@ static void diff_mark_adjust_tp(tabpage_T *tp, int idx, linenr_T line1,
}
if (tp == curtab) {
diff_redraw(true);
// Don't redraw right away, this updates the diffs, which can be slow.
need_diff_redraw = true;
// Need to recompute the scroll binding, may remove or add filler
// lines (e.g., when adding lines above w_topline). But it's slow when
@ -634,8 +636,9 @@ static int diff_check_sanity(tabpage_T *tp, diff_T *dp)
/// Mark all diff buffers in the current tab page for redraw.
///
/// @param dofold Also recompute the folds
static void diff_redraw(int dofold)
void diff_redraw(bool dofold)
{
need_diff_redraw = false;
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
if (!wp->w_p_diff) {
continue;
@ -1472,6 +1475,13 @@ void ex_diffoff(exarg_T *eap)
diff_buf_clear();
}
if (!diffwin) {
diff_need_update = false;
curtab->tp_diff_invalid = false;
curtab->tp_diff_update = false;
diff_clear(curtab);
}
// Remove "hor" from from 'scrollopt' if there are no diff windows left.
if (!diffwin && (vim_strchr(p_sbo, 'h') != NULL)) {
do_cmdline_cmd("set sbo-=hor");
@ -1712,6 +1722,7 @@ static void diff_copy_entry(diff_T *dprev, diff_T *dp, int idx_orig,
///
/// @param tp
void diff_clear(tabpage_T *tp)
FUNC_ATTR_NONNULL_ALL
{
diff_T *p;
diff_T *next_p;
@ -2141,6 +2152,9 @@ int diffopt_changed(void)
} else if (STRNCMP(p, "hiddenoff", 9) == 0) {
p += 9;
diff_flags_new |= DIFF_HIDDEN_OFF;
} else if (STRNCMP(p, "closeoff", 8) == 0) {
p += 8;
diff_flags_new |= DIFF_CLOSE_OFF;
} else if (STRNCMP(p, "indent-heuristic", 16) == 0) {
p += 16;
diff_indent_heuristic = XDF_INDENT_HEURISTIC;
@ -2216,6 +2230,13 @@ bool diffopt_hiddenoff(void)
return (diff_flags & DIFF_HIDDEN_OFF) != 0;
}
// Return true if 'diffopt' contains "closeoff".
bool diffopt_closeoff(void)
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{
return (diff_flags & DIFF_CLOSE_OFF) != 0;
}
/// Find the difference within a changed line.
///
/// @param wp window whose current buffer to check

View File

@ -4,6 +4,13 @@
#include "nvim/pos.h"
#include "nvim/ex_cmds_defs.h"
// Value set from 'diffopt'.
EXTERN int diff_context INIT(= 6); // context for folds
EXTERN int diff_foldcolumn INIT(= 2); // 'foldcolumn' for diff mode
EXTERN bool diff_need_scrollbind INIT(= false);
EXTERN bool need_diff_redraw INIT(= false); // need to call diff_redraw()
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "diff.h.generated.h"
#endif

View File

@ -771,6 +771,11 @@ void foldUpdate(win_T *wp, linenr_T top, linenr_T bot)
return;
}
if (need_diff_redraw) {
// will update later
return;
}
// Mark all folds from top to bot as maybe-small.
fold_T *fp;
(void)foldFind(&wp->w_folds, top, &fp);

View File

@ -400,11 +400,6 @@ EXTERN bool mouse_past_eol INIT(= false); /* mouse right of line */
EXTERN int mouse_dragging INIT(= 0); /* extending Visual area with
mouse dragging */
/* Value set from 'diffopt'. */
EXTERN int diff_context INIT(= 6); /* context for folds */
EXTERN int diff_foldcolumn INIT(= 2); /* 'foldcolumn' for diff mode */
EXTERN int diff_need_scrollbind INIT(= FALSE);
/* The root of the menu hierarchy. */
EXTERN vimmenu_T *root_menu INIT(= NULL);
/*

View File

@ -612,7 +612,7 @@ return {
alloced=true,
redraw={'current_window'},
varname='p_dip',
defaults={if_true={vi="internal,filler"}}
defaults={if_true={vi="internal,filler,closeoff"}}
},
{
full_name='digraph', abbreviation='dg',

View File

@ -47,6 +47,17 @@ let wsv = winsaveview()
let error = 0
while 1
let lnum = line('.')
if getline(lnum) =~ 'msgid "Text;.*;"'
if getline(lnum + 1) !~ '^msgstr "\([^;]\+;\)\+"'
echomsg 'Mismatching ; in line ' . (lnum + 1)
echomsg 'Did you forget the trailing semicolon?'
if error == 0
let error = lnum + 1
endif
endif
endif
if getline(line('.') - 1) !~ "no-c-format"
" go over the "msgid" and "msgid_plural" lines
let prevfromline = 'foobar'

View File

@ -286,6 +286,11 @@ int update_screen(int type)
return FAIL;
}
// May have postponed updating diffs.
if (need_diff_redraw) {
diff_redraw(true);
}
if (must_redraw) {
if (type < must_redraw) /* use maximal type */
type = must_redraw;

View File

@ -773,3 +773,28 @@ func Test_diff_of_diff()
call StopVimInTerminal(buf)
call delete('Xtest_diff_diff')
endfunc
func CloseoffSetup()
enew
call setline(1, ['one', 'two', 'three'])
diffthis
new
call setline(1, ['one', 'tow', 'three'])
diffthis
call assert_equal(1, &diff)
only!
endfunc
func Test_diff_closeoff()
" "closeoff" included by default: last diff win gets 'diff' reset'
call CloseoffSetup()
call assert_equal(0, &diff)
enew!
" "closeoff" excluded: last diff win keeps 'diff' set'
set diffopt-=closeoff
call CloseoffSetup()
call assert_equal(1, &diff)
diffoff!
enew!
endfunc

View File

@ -2418,6 +2418,7 @@ int win_close(win_T *win, bool free_buf)
bool help_window = false;
tabpage_T *prev_curtab = curtab;
frame_T *win_frame = win->w_floating ? NULL : win->w_frame->fr_parent;
const bool had_diffmode = win->w_p_diff;
if (last_window() && !win->w_floating) {
EMSG(_("E444: Cannot close last window"));
@ -2642,6 +2643,22 @@ int win_close(win_T *win, bool free_buf)
if (help_window)
restore_snapshot(SNAP_HELP_IDX, close_curwin);
// If the window had 'diff' set and now there is only one window left in
// the tab page with 'diff' set, and "closeoff" is in 'diffopt', then
// execute ":diffoff!".
if (diffopt_closeoff() && had_diffmode && curtab == prev_curtab) {
int diffcount = 0;
FOR_ALL_WINDOWS_IN_TAB(dwin, curtab) {
if (dwin->w_p_diff) {
diffcount++;
}
}
if (diffcount == 1) {
do_cmdline_cmd("diffoff!");
}
}
curwin->w_pos_changed = true;
redraw_all_later(NOT_VALID);
return OK;