Merge pull request #13908 from janlazo/vim-8.2.2489

vim-patch:8.1.0341,8.2.{2489,2490,2492,2495,2496}
This commit is contained in:
Jan Edmund Lazo 2021-02-10 20:56:54 -05:00 committed by GitHub
commit 1aec5ba85e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 109 additions and 48 deletions

View File

@ -48,7 +48,7 @@ In each of the edited files these options are set:
'scrollbind' on 'scrollbind' on
'cursorbind' on 'cursorbind' on
'scrollopt' includes "hor" 'scrollopt' includes "hor"
'wrap' off 'wrap' off, or leave as-is if 'diffopt' includes "followwrap"
'foldmethod' "diff" 'foldmethod' "diff"
'foldcolumn' value from 'diffopt', default is 2 'foldcolumn' value from 'diffopt', default is 2
@ -132,7 +132,7 @@ Otherwise they are set to their default value:
'scrollbind' off 'scrollbind' off
'cursorbind' off 'cursorbind' off
'scrollopt' without "hor" 'scrollopt' without "hor"
'wrap' on 'wrap' on, or leave as-is if 'diffopt' includes "followwrap"
'foldmethod' "manual" 'foldmethod' "manual"
'foldcolumn' 0 'foldcolumn' 0

View File

@ -1971,6 +1971,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 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.
followwrap Follow the 'wrap' option and leave as it is.
internal Use the internal diff library. This is internal Use the internal diff library. This is
ignored when 'diffexpr' is set. *E960* ignored when 'diffexpr' is set. *E960*
When running out of memory when writing a When running out of memory when writing a

View File

@ -58,6 +58,7 @@ static bool diff_need_update = false; // ex_diffupdate needs to be called
#define DIFF_HIDDEN_OFF 0x100 // diffoff when hidden #define DIFF_HIDDEN_OFF 0x100 // diffoff when hidden
#define DIFF_INTERNAL 0x200 // use internal xdiff algorithm #define DIFF_INTERNAL 0x200 // use internal xdiff algorithm
#define DIFF_CLOSE_OFF 0x400 // diffoff when closing window #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) #define ALL_WHITE_DIFF (DIFF_IWHITE | DIFF_IWHITEALL | DIFF_IWHITEEOL)
static int diff_flags = DIFF_INTERNAL | DIFF_FILLER | DIFF_CLOSE_OFF; static int diff_flags = DIFF_INTERNAL | DIFF_FILLER | DIFF_CLOSE_OFF;
@ -1361,11 +1362,12 @@ void diff_win_options(win_T *wp, int addbuf)
wp->w_p_crb_save = wp->w_p_crb; wp->w_p_crb_save = wp->w_p_crb;
} }
wp->w_p_crb = true; wp->w_p_crb = true;
if (!(diff_flags & DIFF_FOLLOWWRAP)) {
if (!wp->w_p_diff) { if (!wp->w_p_diff) {
wp->w_p_wrap_save = wp->w_p_wrap; wp->w_p_wrap_save = wp->w_p_wrap;
}
wp->w_p_wrap = false;
} }
wp->w_p_wrap = false;
curwin = wp; // -V519 curwin = wp; // -V519
curbuf = curwin->w_buffer; curbuf = curwin->w_buffer;
@ -1437,11 +1439,11 @@ void ex_diffoff(exarg_T *eap)
if (wp->w_p_crb) { if (wp->w_p_crb) {
wp->w_p_crb = wp->w_p_crb_save; wp->w_p_crb = wp->w_p_crb_save;
} }
if (!(diff_flags & DIFF_FOLLOWWRAP)) {
if (!wp->w_p_wrap) { if (!wp->w_p_wrap) {
wp->w_p_wrap = wp->w_p_wrap_save; wp->w_p_wrap = wp->w_p_wrap_save;
}
} }
free_string_option(wp->w_p_fdm); free_string_option(wp->w_p_fdm);
wp->w_p_fdm = vim_strsave(*wp->w_p_fdm_save wp->w_p_fdm = vim_strsave(*wp->w_p_fdm_save
? wp->w_p_fdm_save ? wp->w_p_fdm_save
@ -2158,6 +2160,9 @@ int diffopt_changed(void)
} else if (STRNCMP(p, "closeoff", 8) == 0) { } else if (STRNCMP(p, "closeoff", 8) == 0) {
p += 8; p += 8;
diff_flags_new |= DIFF_CLOSE_OFF; 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) { } else if (STRNCMP(p, "indent-heuristic", 16) == 0) {
p += 16; p += 16;
diff_indent_heuristic = XDF_INDENT_HEURISTIC; diff_indent_heuristic = XDF_INDENT_HEURISTIC;

View File

@ -1629,27 +1629,26 @@ static void f_deletebufline(typval_T *argvars, typval_T *rettv, FunPtr fptr)
if (u_save(first - 1, last + 1) == FAIL) { if (u_save(first - 1, last + 1) == FAIL) {
rettv->vval.v_number = 1; // FAIL rettv->vval.v_number = 1; // FAIL
return; } else {
} for (linenr_T lnum = first; lnum <= last; lnum++) {
ml_delete(first, true);
}
for (linenr_T lnum = first; lnum <= last; lnum++) { FOR_ALL_TAB_WINDOWS(tp, wp) {
ml_delete(first, true); if (wp->w_buffer == buf) {
} if (wp->w_cursor.lnum > last) {
wp->w_cursor.lnum -= count;
FOR_ALL_TAB_WINDOWS(tp, wp) { } else if (wp->w_cursor.lnum> first) {
if (wp->w_buffer == buf) { wp->w_cursor.lnum = first;
if (wp->w_cursor.lnum > last) { }
wp->w_cursor.lnum -= count; if (wp->w_cursor.lnum > wp->w_buffer->b_ml.ml_line_count) {
} else if (wp->w_cursor.lnum> first) { wp->w_cursor.lnum = wp->w_buffer->b_ml.ml_line_count;
wp->w_cursor.lnum = first; }
}
if (wp->w_cursor.lnum > wp->w_buffer->b_ml.ml_line_count) {
wp->w_cursor.lnum = wp->w_buffer->b_ml.ml_line_count;
} }
} }
check_cursor_col();
deleted_lines_mark(first, count);
} }
check_cursor_col();
deleted_lines_mark(first, count);
if (!is_curbuf) { if (!is_curbuf) {
curbuf = curbuf_save; curbuf = curbuf_save;

View File

@ -1657,9 +1657,11 @@ int get_arglist_exp(char_u *str, int *fcountp, char_u ***fnamesp, bool wig)
/// AL_DEL: remove files in 'str' from the argument list. /// AL_DEL: remove files in 'str' from the argument list.
/// @param after /// @param after
/// 0 means before first one /// 0 means before first one
/// @param will_edit will edit added argument
/// ///
/// @return FAIL for failure, OK otherwise. /// @return FAIL for failure, OK otherwise.
static int do_arglist(char_u *str, int what, int after) static int do_arglist(char_u *str, int what, int after, bool will_edit)
FUNC_ATTR_NONNULL_ALL
{ {
garray_T new_ga; garray_T new_ga;
int exp_count; int exp_count;
@ -1733,10 +1735,11 @@ static int do_arglist(char_u *str, int what, int after)
} }
if (what == AL_ADD) { if (what == AL_ADD) {
(void)alist_add_list(exp_count, exp_files, after); alist_add_list(exp_count, exp_files, after, will_edit);
xfree(exp_files); xfree(exp_files);
} else { // what == AL_SET } else {
alist_set(ALIST(curwin), exp_count, exp_files, false, NULL, 0); assert(what == AL_SET);
alist_set(ALIST(curwin), exp_count, exp_files, will_edit, NULL, 0);
} }
} }
@ -1956,7 +1959,7 @@ void ex_next(exarg_T *eap)
| (eap->forceit ? CCGD_FORCEIT : 0) | (eap->forceit ? CCGD_FORCEIT : 0)
| CCGD_EXCMD)) { | CCGD_EXCMD)) {
if (*eap->arg != NUL) { // redefine file list if (*eap->arg != NUL) { // redefine file list
if (do_arglist(eap->arg, AL_SET, 0) == FAIL) { if (do_arglist(eap->arg, AL_SET, 0, true) == FAIL) {
return; return;
} }
i = 0; i = 0;
@ -1974,7 +1977,7 @@ void ex_argedit(exarg_T *eap)
// Whether curbuf will be reused, curbuf->b_ffname will be set. // Whether curbuf will be reused, curbuf->b_ffname will be set.
bool curbuf_is_reusable = curbuf_reusable(); bool curbuf_is_reusable = curbuf_reusable();
if (do_arglist(eap->arg, AL_ADD, i) == FAIL) { if (do_arglist(eap->arg, AL_ADD, i, true) == FAIL) {
return; return;
} }
maketitle(); maketitle();
@ -1994,7 +1997,8 @@ void ex_argedit(exarg_T *eap)
void ex_argadd(exarg_T *eap) void ex_argadd(exarg_T *eap)
{ {
do_arglist(eap->arg, AL_ADD, do_arglist(eap->arg, AL_ADD,
eap->addr_count > 0 ? (int)eap->line2 : curwin->w_arg_idx + 1); eap->addr_count > 0 ? (int)eap->line2 : curwin->w_arg_idx + 1,
false);
maketitle(); maketitle();
} }
@ -2041,7 +2045,7 @@ void ex_argdelete(exarg_T *eap)
} }
} }
} else { } else {
do_arglist(eap->arg, AL_DEL, 0); do_arglist(eap->arg, AL_DEL, 0, false);
} }
maketitle(); maketitle();
} }
@ -2292,9 +2296,9 @@ void ex_listdo(exarg_T *eap)
/// Files[] itself is not taken over. /// Files[] itself is not taken over.
/// ///
/// @param after: where to add: 0 = before first one /// @param after: where to add: 0 = before first one
/// /// @param will_edit will edit adding argument
/// @return index of first added argument static void alist_add_list(int count, char_u **files, int after, bool will_edit)
static int alist_add_list(int count, char_u **files, int after) FUNC_ATTR_NONNULL_ALL
{ {
int old_argcount = ARGCOUNT; int old_argcount = ARGCOUNT;
ga_grow(&ALIST(curwin)->al_ga, count); ga_grow(&ALIST(curwin)->al_ga, count);
@ -2310,15 +2314,15 @@ static int alist_add_list(int count, char_u **files, int after)
(size_t)(ARGCOUNT - after) * sizeof(aentry_T)); (size_t)(ARGCOUNT - after) * sizeof(aentry_T));
} }
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
const int flags = BLN_LISTED | (will_edit ? BLN_CURBUF : 0);
ARGLIST[after + i].ae_fname = files[i]; ARGLIST[after + i].ae_fname = files[i];
ARGLIST[after + i].ae_fnum = buflist_add(files[i], ARGLIST[after + i].ae_fnum = buflist_add(files[i], flags);
BLN_LISTED | BLN_CURBUF);
} }
ALIST(curwin)->al_ga.ga_len += count; ALIST(curwin)->al_ga.ga_len += count;
if (old_argcount > 0 && curwin->w_arg_idx >= after) { if (old_argcount > 0 && curwin->w_arg_idx >= after) {
curwin->w_arg_idx += count; curwin->w_arg_idx += count;
} }
return after; return;
} }
} }
@ -3766,7 +3770,7 @@ void ex_drop(exarg_T *eap)
// and mostly only one file is dropped. // and mostly only one file is dropped.
// This also ignores wildcards, since it is very unlikely the user is // This also ignores wildcards, since it is very unlikely the user is
// editing a file name with a wildcard character. // editing a file name with a wildcard character.
do_arglist(eap->arg, AL_SET, 0); do_arglist(eap->arg, AL_SET, 0, false);
// Expanding wildcards may result in an empty argument list. E.g. when // Expanding wildcards may result in an empty argument list. E.g. when
// editing "foo.pyc" and ".pyc" is in 'wildignore'. Assume that we // editing "foo.pyc" and ".pyc" is in 'wildignore'. Assume that we

View File

@ -6441,7 +6441,7 @@ static int open_cmdwin(void)
cmdwin_level = ccline.level; cmdwin_level = ccline.level;
// Create empty command-line buffer. // Create empty command-line buffer.
buf_open_scratch(0, "[Command Line]"); buf_open_scratch(0, _("[Command Line]"));
// Command-line buffer has bufhidden=wipe, unlike a true "scratch" buffer. // Command-line buffer has bufhidden=wipe, unlike a true "scratch" buffer.
set_option_value("bh", 0L, "wipe", OPT_LOCAL); set_option_value("bh", 0L, "wipe", OPT_LOCAL);
curwin->w_p_rl = cmdmsg_rl; curwin->w_p_rl = cmdmsg_rl;

View File

@ -888,11 +888,11 @@ void curs_columns(
} else { } else {
n = plines; n = plines;
} }
if ((colnr_T)n >= wp->w_height_inner + wp->w_skipcol / width) { if ((colnr_T)n >= wp->w_height_inner + wp->w_skipcol / width - so) {
extra += 2; extra += 2;
} }
if (extra == 3 || plines < so * 2) { if (extra == 3 || plines <= so * 2) {
// not enough room for 'scrolloff', put cursor in the middle // not enough room for 'scrolloff', put cursor in the middle
n = wp->w_virtcol / width; n = wp->w_virtcol / width;
if (n > wp->w_height_inner / 2) { if (n > wp->w_height_inner / 2) {

View File

@ -80,6 +80,24 @@ func Test_argadd()
call assert_equal(0, len(argv())) call assert_equal(0, len(argv()))
endfunc endfunc
func Test_argadd_empty_curbuf()
new
let curbuf = bufnr('%')
call writefile(['test', 'Xargadd'], 'Xargadd')
" must not re-use the current buffer.
argadd Xargadd
call assert_equal(curbuf, bufnr('%'))
call assert_equal('', bufname('%'))
call assert_equal(1, line('$'))
rew
call assert_notequal(curbuf, bufnr('%'))
call assert_equal('Xargadd', bufname('%'))
call assert_equal(2, line('$'))
%argd
bwipe!
endfunc
func Init_abc() func Init_abc()
args a b c args a b c
next next

View File

@ -353,14 +353,19 @@ func Test_breakindent19_sbr_nextpage()
" Scroll down one screen line " Scroll down one screen line
setl scrolloff=5 setl scrolloff=5
norm! 5gj norm! 5gj
redraw!
let lines = s:screen_lines(1, 20) let lines = s:screen_lines(1, 20)
let expect = [ let expect = [
\ "> aaaaaaaaaaaaaaaaaa", \ "aaaaaaaaaaaaaaaaaaaa",
\ "> aaaaaaaaaaaaaaaaaa", \ "> aaaaaaaaaaaaaaaaaa",
\ "> aaaaaaaaaaaaaaaaaa", \ "> aaaaaaaaaaaaaaaaaa",
\ ] \ ]
call s:compare_lines(expect, lines) call s:compare_lines(expect, lines)
redraw!
" moving the cursor doesn't change the text offset
norm! l
redraw!
let lines = s:screen_lines(1, 20)
call s:compare_lines(expect, lines)
setl breakindent briopt=min:18 sbr=> setl breakindent briopt=min:18 sbr=>
norm! 5gj norm! 5gj

View File

@ -112,6 +112,17 @@ func Test_deletebufline()
call assert_equal(0, deletebufline(b, 1)) call assert_equal(0, deletebufline(b, 1))
call assert_equal(['b', 'c'], getbufline(b, 1, 2)) call assert_equal(['b', 'c'], getbufline(b, 1, 2))
exe "bwipe! " . b exe "bwipe! " . b
edit XbufOne
let one = bufnr()
call setline(1, ['a', 'b', 'c'])
setlocal nomodifiable
split XbufTwo
let two = bufnr()
call assert_fails('call deletebufline(one, 1)', 'E21:')
call assert_equal(two, bufnr())
bwipe! XbufTwo
bwipe! XbufOne
endfunc endfunc
func Test_appendbufline_redraw() func Test_appendbufline_redraw()

View File

@ -158,7 +158,9 @@ endfunc
func Test_command_count_4() func Test_command_count_4()
%argd %argd
let bufnr = bufnr('$') let bufnr = bufnr('$')
arga aa bb cc dd ee ff next aa bb cc dd ee ff
call assert_equal(bufnr, bufnr('%'))
3argu 3argu
let args = [] let args = []
.,$-argdo call add(args, expand('%')) .,$-argdo call add(args, expand('%'))

View File

@ -964,6 +964,21 @@ func Test_diff_closeoff()
enew! enew!
endfunc 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_rnu() func Test_diff_rnu()
CheckScreendump CheckScreendump