Merge pull request #19373 from zeertzjq/vim-8.2.0426

vim-patch:8.0.1118,8.2.0426
This commit is contained in:
zeertzjq 2022-07-15 16:49:00 +08:00 committed by GitHub
commit 564d99c89a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 59 additions and 21 deletions

View File

@ -94,11 +94,19 @@ static char *e_buflocked = N_("E937: Attempt to delete a buffer that is in use")
// Number of times free_buffer() was called. // Number of times free_buffer() was called.
static int buf_free_count = 0; static int buf_free_count = 0;
static int top_file_num = 1; ///< highest file number
typedef enum { typedef enum {
kBffClearWinInfo = 1, kBffClearWinInfo = 1,
kBffInitChangedtick = 2, kBffInitChangedtick = 2,
} BufFreeFlags; } BufFreeFlags;
/// @return the highest possible buffer number
int get_highest_fnum(void)
{
return top_file_num - 1;
}
/// Read data from buffer for retrying. /// Read data from buffer for retrying.
/// ///
/// @param read_stdin read file from stdin, otherwise fifo /// @param read_stdin read file from stdin, otherwise fifo
@ -443,6 +451,7 @@ bool close_buffer(win_T *win, buf_T *buf, int action, bool abort_if_last, bool i
return false; return false;
} }
// check no autocommands closed the window
if (win != NULL // Avoid bogus clang warning. if (win != NULL // Avoid bogus clang warning.
&& win_valid_any_tab(win)) { && win_valid_any_tab(win)) {
// Set b_last_cursor when closing the last window for the buffer. // Set b_last_cursor when closing the last window for the buffer.
@ -1643,8 +1652,6 @@ void no_write_message_nobang(const buf_T *const buf)
// functions for dealing with the buffer list // functions for dealing with the buffer list
// //
static int top_file_num = 1; ///< highest file number
/// Initialize b:changedtick and changedtick_val attribute /// Initialize b:changedtick and changedtick_val attribute
/// ///
/// @param[out] buf Buffer to initialize for. /// @param[out] buf Buffer to initialize for.

View File

@ -4862,8 +4862,7 @@ void ex_help(exarg_T *eap)
* Re-use an existing help window or open a new one. * Re-use an existing help window or open a new one.
* Always open a new one for ":tab help". * Always open a new one for ":tab help".
*/ */
if (!bt_help(curwin->w_buffer) if (!bt_help(curwin->w_buffer) || cmdmod.cmod_tab != 0) {
|| cmdmod.cmod_tab != 0) {
if (cmdmod.cmod_tab != 0) { if (cmdmod.cmod_tab != 0) {
wp = NULL; wp = NULL;
} else { } else {

View File

@ -1018,8 +1018,7 @@ void check_arg_idx(win_T *win)
// We are editing the current entry in the argument list. // We are editing the current entry in the argument list.
// Set "arg_had_last" if it's also the last one // Set "arg_had_last" if it's also the last one
win->w_arg_idx_invalid = false; win->w_arg_idx_invalid = false;
if (win->w_arg_idx == WARGCOUNT(win) - 1 if (win->w_arg_idx == WARGCOUNT(win) - 1 && win->w_alist == &global_alist) {
&& win->w_alist == &global_alist) {
arg_had_last = true; arg_had_last = true;
} }
} }
@ -1150,8 +1149,7 @@ void do_argfile(exarg_T *eap, int argn)
} }
curwin->w_arg_idx = argn; curwin->w_arg_idx = argn;
if (argn == ARGCOUNT - 1 if (argn == ARGCOUNT - 1 && curwin->w_alist == &global_alist) {
&& curwin->w_alist == &global_alist) {
arg_had_last = true; arg_had_last = true;
} }

View File

@ -4616,8 +4616,9 @@ char *invalid_range(exarg_T *eap)
} }
break; break;
case ADDR_BUFFERS: case ADDR_BUFFERS:
if (eap->line1 < firstbuf->b_fnum // Only a boundary check, not whether the buffers actually
|| eap->line2 > lastbuf->b_fnum) { // exist.
if (eap->line1 < 1 || eap->line2 > get_highest_fnum()) {
return _(e_invrange); return _(e_invrange);
} }
break; break;

View File

@ -786,8 +786,7 @@ void curs_columns(win_T *wp, int may_scroll)
} else { } else {
wp->w_wrow = wp->w_height_inner - 1 - wp->w_empty_rows; wp->w_wrow = wp->w_height_inner - 1 - wp->w_empty_rows;
} }
} else if (wp->w_p_wrap } else if (wp->w_p_wrap && wp->w_width_inner != 0) {
&& wp->w_width_inner != 0) {
width = textwidth + win_col_off2(wp); width = textwidth + win_col_off2(wp);
// long line wrapping, adjust wp->w_wrow // long line wrapping, adjust wp->w_wrow
@ -1083,8 +1082,7 @@ bool scrolldown(long line_count, int byfold)
* and move the cursor onto the displayed part of the window. * and move the cursor onto the displayed part of the window.
*/ */
int wrow = curwin->w_wrow; int wrow = curwin->w_wrow;
if (curwin->w_p_wrap if (curwin->w_p_wrap && curwin->w_width_inner != 0) {
&& curwin->w_width_inner != 0) {
validate_virtcol(); validate_virtcol();
validate_cheight(); validate_cheight();
wrow += curwin->w_cline_height - 1 - wrow += curwin->w_cline_height - 1 -

View File

@ -6012,8 +6012,7 @@ static void nv_g_home_m_cmd(cmdarg_T *cap)
cap->oap->motion_type = kMTCharWise; cap->oap->motion_type = kMTCharWise;
cap->oap->inclusive = false; cap->oap->inclusive = false;
if (curwin->w_p_wrap if (curwin->w_p_wrap && curwin->w_width_inner != 0) {
&& curwin->w_width_inner != 0) {
int width1 = curwin->w_width_inner - curwin_col_off(); int width1 = curwin->w_width_inner - curwin_col_off();
int width2 = width1 + curwin_col_off2(); int width2 = width1 + curwin_col_off2();

View File

@ -1863,6 +1863,7 @@ parse_line:
// For "normal" tags: Do a quick check if the tag matches. // For "normal" tags: Do a quick check if the tag matches.
// This speeds up tag searching a lot! // This speeds up tag searching a lot!
if (orgpat.headlen) { if (orgpat.headlen) {
memset(&tagp, 0, sizeof(tagp));
tagp.tagname = lbuf; tagp.tagname = lbuf;
tagp.tagname_end = (char_u *)vim_strchr((char *)lbuf, TAB); tagp.tagname_end = (char_u *)vim_strchr((char *)lbuf, TAB);
if (tagp.tagname_end == NULL) { if (tagp.tagname_end == NULL) {
@ -2784,7 +2785,7 @@ static int jumpto_tag(const char_u *lbuf_arg, int forceit, int keep_help)
// A :ta from a help file will keep the b_help flag set. For ":ptag" // A :ta from a help file will keep the b_help flag set. For ":ptag"
// we need to use the flag from the window where we came from. // we need to use the flag from the window where we came from.
if (l_g_do_tagpreview != 0) { if (l_g_do_tagpreview != 0) {
keep_help_flag = curwin_save->w_buffer->b_help; keep_help_flag = bt_help(curwin_save->w_buffer);
} else { } else {
keep_help_flag = curbuf->b_help; keep_help_flag = curbuf->b_help;
} }

View File

@ -146,6 +146,7 @@ endfunc
func Test_bdelete_cmd() func Test_bdelete_cmd()
%bwipe! %bwipe!
call assert_fails('bdelete 5', 'E516:') call assert_fails('bdelete 5', 'E516:')
call assert_fails('1,1bdelete 1 2', 'E488:')
" Deleting a unlisted and unloaded buffer " Deleting a unlisted and unloaded buffer
edit Xfile1 edit Xfile1

View File

@ -2656,7 +2656,7 @@ func Test_normal49_counts()
endfunc endfunc
func Test_normal50_commandline() func Test_normal50_commandline()
if !has("timers") || !has("cmdline_hist") || !has("vertsplit") if !has("timers") || !has("cmdline_hist")
return return
endif endif
func! DoTimerWork(id) func! DoTimerWork(id)

View File

@ -290,9 +290,10 @@ func Test_set_errors()
call assert_fails('set regexpengine=3', 'E474:') call assert_fails('set regexpengine=3', 'E474:')
call assert_fails('set history=10001', 'E474:') call assert_fails('set history=10001', 'E474:')
call assert_fails('set numberwidth=21', 'E474:') call assert_fails('set numberwidth=21', 'E474:')
call assert_fails('set colorcolumn=-a') call assert_fails('set colorcolumn=-a', 'E474:')
call assert_fails('set colorcolumn=a') call assert_fails('set colorcolumn=a', 'E474:')
call assert_fails('set colorcolumn=1,') call assert_fails('set colorcolumn=1,', 'E474:')
call assert_fails('set colorcolumn=1;', 'E474:')
call assert_fails('set cmdheight=-1', 'E487:') call assert_fails('set cmdheight=-1', 'E487:')
call assert_fails('set cmdwinheight=-1', 'E487:') call assert_fails('set cmdwinheight=-1', 'E487:')
if has('conceal') if has('conceal')
@ -343,9 +344,13 @@ func Test_set_errors()
call assert_fails('set guicursor=i-ci,r-cr:h', 'E545:') call assert_fails('set guicursor=i-ci,r-cr:h', 'E545:')
call assert_fails('set guicursor=i-ci', 'E545:') call assert_fails('set guicursor=i-ci', 'E545:')
call assert_fails('set guicursor=x', 'E545:') call assert_fails('set guicursor=x', 'E545:')
call assert_fails('set guicursor=x:', 'E546:')
call assert_fails('set guicursor=r-cr:horx', 'E548:') call assert_fails('set guicursor=r-cr:horx', 'E548:')
call assert_fails('set guicursor=r-cr:hor0', 'E549:') call assert_fails('set guicursor=r-cr:hor0', 'E549:')
endif endif
if has('mouseshape')
call assert_fails('se mouseshape=i-r:x', 'E547:')
endif
call assert_fails('set backupext=~ patchmode=~', 'E589:') call assert_fails('set backupext=~ patchmode=~', 'E589:')
call assert_fails('set winminheight=10 winheight=9', 'E591:') call assert_fails('set winminheight=10 winheight=9', 'E591:')
call assert_fails('set winminwidth=10 winwidth=9', 'E592:') call assert_fails('set winminwidth=10 winwidth=9', 'E592:')

View File

@ -172,6 +172,35 @@ func Test_window_split_edit_bufnr()
%bw! %bw!
endfunc endfunc
func Test_window_split_no_room()
" N horizontal windows need >= 2*N + 1 lines:
" - 1 line + 1 status line in each window
" - 1 Ex command line
"
" 2*N + 1 <= &lines
" N <= (lines - 1)/2
"
" Beyond that number of windows, E36: Not enough room is expected.
let hor_win_count = (&lines - 1)/2
let hor_split_count = hor_win_count - 1
for s in range(1, hor_split_count) | split | endfor
call assert_fails('split', 'E36:')
" N vertical windows need >= 2*(N - 1) + 1 columns:
" - 1 column + 1 separator for each window (except last window)
" - 1 column for the last window which does not have separator
"
" 2*(N - 1) + 1 <= &columns
" 2*N - 1 <= &columns
" N <= (&columns + 1)/2
let ver_win_count = (&columns + 1)/2
let ver_split_count = ver_win_count - 1
for s in range(1, ver_split_count) | vsplit | endfor
call assert_fails('vsplit', 'E36:')
%bw!
endfunc
func Test_window_exchange() func Test_window_exchange()
e Xa e Xa