mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
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:
commit
1aec5ba85e
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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) {
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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()
|
||||||
|
@ -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('%'))
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user