Merge #10391 from janlazo/vim-8.1.0495

vim-patch:8.1.{495,505,531,533,583,623,630,641,686,715,833,1012,1221,1651}
This commit is contained in:
Justin M. Keyes
2019-07-16 19:52:23 +02:00
committed by GitHub
15 changed files with 319 additions and 144 deletions

View File

@@ -358,7 +358,20 @@ g8 Print the hex values of the bytes used in the
The pattern is matched against the relevant part of The pattern is matched against the relevant part of
the output, not necessarily the whole line. Only some the output, not necessarily the whole line. Only some
commands support filtering, try it out to check if it commands support filtering, try it out to check if it
works. works. Some of the commands that support filtering:
|:#| - filter whole line
|:clist| - filter by file name or module name
|:command| - filter by command name
|:files| - filter by file name
|:highlight| - filter by highlight group
|:jumps| - filter by file name
|:let| - filter by variable name
|:list| - filter whole line
|:llist| - filter by file name or module name
|:marks| - filter by text in the current file,
or file name for other files
|:oldfiles| - filter by file name
|:set| - filter by variable name
Only normal messages are filtered, error messages are Only normal messages are filtered, error messages are
not. not.

View File

@@ -1782,6 +1782,15 @@ static void list_hashtable_vars(hashtab_T *ht, const char *prefix, int empty,
if (!HASHITEM_EMPTY(hi)) { if (!HASHITEM_EMPTY(hi)) {
todo--; todo--;
di = TV_DICT_HI2DI(hi); di = TV_DICT_HI2DI(hi);
char buf[IOSIZE];
// apply :filter /pat/ to variable name
xstrlcpy(buf, prefix, IOSIZE - 1);
xstrlcat(buf, (char *)di->di_key, IOSIZE);
if (message_filtered((char_u *)buf)) {
continue;
}
if (empty || di->di_tv.v_type != VAR_STRING if (empty || di->di_tv.v_type != VAR_STRING
|| di->di_tv.vval.v_string != NULL) { || di->di_tv.vval.v_string != NULL) {
list_one_var(di, prefix, first); list_one_var(di, prefix, first);
@@ -2360,6 +2369,7 @@ static char_u *get_lval(char_u *const name, typval_T *const rettv,
/* Can't add "v:" variable. */ /* Can't add "v:" variable. */
if (lp->ll_dict == &vimvardict) { if (lp->ll_dict == &vimvardict) {
EMSG2(_(e_illvar), name); EMSG2(_(e_illvar), name);
tv_clear(&var1);
return NULL; return NULL;
} }
@@ -4326,7 +4336,7 @@ static int eval7(
// Dictionary: {key: val, key: val} // Dictionary: {key: val, key: val}
case '{': ret = get_lambda_tv(arg, rettv, evaluate); case '{': ret = get_lambda_tv(arg, rettv, evaluate);
if (ret == NOTDONE) { if (ret == NOTDONE) {
ret = get_dict_tv(arg, rettv, evaluate); ret = dict_get_tv(arg, rettv, evaluate);
} }
break; break;
@@ -5710,7 +5720,7 @@ static bool set_ref_in_funccal(funccall_T *fc, int copyID)
* Allocate a variable for a Dictionary and fill it from "*arg". * Allocate a variable for a Dictionary and fill it from "*arg".
* Return OK or FAIL. Returns NOTDONE for {expr}. * Return OK or FAIL. Returns NOTDONE for {expr}.
*/ */
static int get_dict_tv(char_u **arg, typval_T *rettv, int evaluate) static int dict_get_tv(char_u **arg, typval_T *rettv, int evaluate)
{ {
dict_T *d = NULL; dict_T *d = NULL;
typval_T tvkey; typval_T tvkey;
@@ -20851,6 +20861,9 @@ void ex_function(exarg_T *eap)
if (!HASHITEM_EMPTY(hi)) { if (!HASHITEM_EMPTY(hi)) {
--todo; --todo;
fp = HI2UF(hi); fp = HI2UF(hi);
if (message_filtered(fp->uf_name)) {
continue;
}
if (!func_name_refcount(fp->uf_name)) { if (!func_name_refcount(fp->uf_name)) {
list_func_head(fp, false); list_func_head(fp, false);
} }

View File

@@ -9322,26 +9322,30 @@ static frame_T *ses_skipframe(frame_T *fr)
{ {
frame_T *frc; frame_T *frc;
for (frc = fr; frc != NULL; frc = frc->fr_next) FOR_ALL_FRAMES(frc, fr) {
if (ses_do_frame(frc)) if (ses_do_frame(frc)) {
break; break;
}
}
return frc; return frc;
} }
/* // Return true if frame "fr" has a window somewhere that we want to save in
* Return TRUE if frame "fr" has a window somewhere that we want to save in // the Session.
* the Session. static bool ses_do_frame(const frame_T *fr)
*/ FUNC_ATTR_NONNULL_ARG(1)
static int ses_do_frame(frame_T *fr)
{ {
frame_T *frc; const frame_T *frc;
if (fr->fr_layout == FR_LEAF) if (fr->fr_layout == FR_LEAF) {
return ses_do_win(fr->fr_win); return ses_do_win(fr->fr_win);
for (frc = fr->fr_child; frc != NULL; frc = frc->fr_next) }
if (ses_do_frame(frc)) FOR_ALL_FRAMES(frc, fr->fr_child) {
return TRUE; if (ses_do_frame(frc)) {
return FALSE; return true;
}
}
return false;
} }
/// Return non-zero if window "wp" is to be stored in the Session. /// Return non-zero if window "wp" is to be stored in the Session.

View File

@@ -435,10 +435,11 @@ EXTERN win_T *firstwin; /* first window */
EXTERN win_T *lastwin; /* last window */ EXTERN win_T *lastwin; /* last window */
EXTERN win_T *prevwin INIT(= NULL); /* previous window */ EXTERN win_T *prevwin INIT(= NULL); /* previous window */
# define ONE_WINDOW (firstwin == lastwin) # define ONE_WINDOW (firstwin == lastwin)
/* # define FOR_ALL_FRAMES(frp, first_frame) \
* When using this macro "break" only breaks out of the inner loop. Use "goto" for (frp = first_frame; frp != NULL; frp = frp->fr_next) // NOLINT
* to break out of the tabpage loop.
*/ // When using this macro "break" only breaks out of the inner loop. Use "goto"
// to break out of the tabpage loop.
# define FOR_ALL_TAB_WINDOWS(tp, wp) \ # define FOR_ALL_TAB_WINDOWS(tp, wp) \
FOR_ALL_TABS(tp) \ FOR_ALL_TABS(tp) \
FOR_ALL_WINDOWS_IN_TAB(wp, tp) FOR_ALL_WINDOWS_IN_TAB(wp, tp)

View File

@@ -656,49 +656,52 @@ show_one_mark(
int c, int c,
char_u *arg, char_u *arg,
pos_T *p, pos_T *p,
char_u *name, char_u *name_arg,
int current /* in current file */ int current // in current file
) )
{ {
static int did_title = FALSE; static bool did_title = false;
int mustfree = FALSE; bool mustfree = false;
char_u *name = name_arg;
if (c == -1) { /* finish up */ if (c == -1) { // finish up
if (did_title) if (did_title) {
did_title = FALSE; did_title = false;
else { } else {
if (arg == NULL) if (arg == NULL) {
MSG(_("No marks set")); MSG(_("No marks set"));
else } else {
EMSG2(_("E283: No marks matching \"%s\""), arg); EMSG2(_("E283: No marks matching \"%s\""), arg);
} }
} }
/* don't output anything if 'q' typed at --more-- prompt */ } else if (!got_int
else if (!got_int
&& (arg == NULL || vim_strchr(arg, c) != NULL) && (arg == NULL || vim_strchr(arg, c) != NULL)
&& p->lnum != 0) { && p->lnum != 0) {
// don't output anything if 'q' typed at --more-- prompt
if (name == NULL && current) {
name = mark_line(p, 15);
mustfree = true;
}
if (!message_filtered(name)) {
if (!did_title) { if (!did_title) {
/* Highlight title */ // Highlight title
MSG_PUTS_TITLE(_("\nmark line col file/text")); msg_puts_title(_("\nmark line col file/text"));
did_title = TRUE; did_title = true;
} }
msg_putchar('\n'); msg_putchar('\n');
if (!got_int) { if (!got_int) {
sprintf((char *)IObuff, " %c %6ld %4d ", c, p->lnum, p->col); snprintf((char *)IObuff, IOSIZE, " %c %6ld %4d ", c, p->lnum, p->col);
msg_outtrans(IObuff); msg_outtrans(IObuff);
if (name == NULL && current) {
name = mark_line(p, 15);
mustfree = TRUE;
}
if (name != NULL) { if (name != NULL) {
msg_outtrans_attr(name, current ? HL_ATTR(HLF_D) : 0); msg_outtrans_attr(name, current ? HL_ATTR(HLF_D) : 0);
}
}
ui_flush(); // show one line at a time
}
if (mustfree) { if (mustfree) {
xfree(name); xfree(name);
} }
} }
}
ui_flush(); /* show one line at a time */
}
} }
/* /*
@@ -786,8 +789,12 @@ void ex_jumps(exarg_T *eap)
for (i = 0; i < curwin->w_jumplistlen && !got_int; ++i) { for (i = 0; i < curwin->w_jumplistlen && !got_int; ++i) {
if (curwin->w_jumplist[i].fmark.mark.lnum != 0) { if (curwin->w_jumplist[i].fmark.mark.lnum != 0) {
name = fm_getname(&curwin->w_jumplist[i].fmark, 16); name = fm_getname(&curwin->w_jumplist[i].fmark, 16);
if (name == NULL) /* file name not available */
// apply :filter /pat/ or file name not available
if (name == NULL || message_filtered(name)) {
xfree(name);
continue; continue;
}
msg_putchar('\n'); msg_putchar('\n');
if (got_int) { if (got_int) {

View File

@@ -1376,9 +1376,8 @@ static void set_vcount_ca(cmdarg_T *cap, bool *set_prevcount)
*set_prevcount = false; /* only set v:prevcount once */ *set_prevcount = false; /* only set v:prevcount once */
} }
/* // Handle an operator after Visual mode or when the movement is finished.
* Handle an operator after visual mode or when the movement is finished // "gui_yank" is true when yanking text for the clipboard.
*/
void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank) void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
{ {
oparg_T *oap = cap->oap; oparg_T *oap = cap->oap;
@@ -1402,8 +1401,12 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
* If an operation is pending, handle it... * If an operation is pending, handle it...
*/ */
if ((finish_op if ((finish_op
|| VIsual_active || VIsual_active)
) && oap->op_type != OP_NOP) { && oap->op_type != OP_NOP) {
// Yank can be redone when 'y' is in 'cpoptions', but not when yanking
// for the clipboard.
const bool redo_yank = vim_strchr(p_cpo, CPO_YANK) != NULL && !gui_yank;
// Avoid a problem with unwanted linebreaks in block mode // Avoid a problem with unwanted linebreaks in block mode
if (curwin->w_p_lbr) { if (curwin->w_p_lbr) {
curwin->w_valid &= ~VALID_VIRTCOL; curwin->w_valid &= ~VALID_VIRTCOL;
@@ -1433,9 +1436,9 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
VIsual_reselect = false; VIsual_reselect = false;
} }
/* Only redo yank when 'y' flag is in 'cpoptions'. */ // Only redo yank when 'y' flag is in 'cpoptions'.
/* Never redo "zf" (define fold). */ // Never redo "zf" (define fold).
if ((vim_strchr(p_cpo, CPO_YANK) != NULL || oap->op_type != OP_YANK) if ((redo_yank || oap->op_type != OP_YANK)
&& ((!VIsual_active || oap->motion_force) && ((!VIsual_active || oap->motion_force)
// Also redo Operator-pending Visual mode mappings. // Also redo Operator-pending Visual mode mappings.
|| (cap->cmdchar == ':' && oap->op_type != OP_COLON)) || (cap->cmdchar == ':' && oap->op_type != OP_COLON))
@@ -1608,8 +1611,8 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
resel_VIsual_line_count = oap->line_count; resel_VIsual_line_count = oap->line_count;
} }
/* can't redo yank (unless 'y' is in 'cpoptions') and ":" */ // can't redo yank (unless 'y' is in 'cpoptions') and ":"
if ((vim_strchr(p_cpo, CPO_YANK) != NULL || oap->op_type != OP_YANK) if ((redo_yank || oap->op_type != OP_YANK)
&& oap->op_type != OP_COLON && oap->op_type != OP_COLON
&& oap->op_type != OP_FOLD && oap->op_type != OP_FOLD
&& oap->op_type != OP_FOLDOPEN && oap->op_type != OP_FOLDOPEN

View File

@@ -5047,6 +5047,11 @@ showoptions(
// collect the items in items[] // collect the items in items[]
item_count = 0; item_count = 0;
for (p = &options[0]; p->fullname != NULL; p++) { for (p = &options[0]; p->fullname != NULL; p++) {
// apply :filter /pat/
if (message_filtered((char_u *)p->fullname)) {
continue;
}
varp = NULL; varp = NULL;
if (opt_flags != 0) { if (opt_flags != 0) {
if (p->indir != PV_NONE) { if (p->indir != PV_NONE) {

View File

@@ -3002,8 +3002,8 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size)
return NULL; \ return NULL; \
} }
if (nfa_calc_size == FALSE) { if (nfa_calc_size == false) {
/* Allocate space for the stack. Max states on the stack : nstate */ // Allocate space for the stack. Max states on the stack: "nstate".
stack = xmalloc((nstate + 1) * sizeof(Frag_T)); stack = xmalloc((nstate + 1) * sizeof(Frag_T));
stackp = stack; stackp = stack;
stack_end = stack + (nstate + 1); stack_end = stack + (nstate + 1);

View File

@@ -4571,17 +4571,21 @@ void redraw_statuslines(void)
/* /*
* Redraw all status lines at the bottom of frame "frp". * Redraw all status lines at the bottom of frame "frp".
*/ */
void win_redraw_last_status(frame_T *frp) void win_redraw_last_status(const frame_T *frp)
FUNC_ATTR_NONNULL_ARG(1)
{ {
if (frp->fr_layout == FR_LEAF) if (frp->fr_layout == FR_LEAF) {
frp->fr_win->w_redr_status = TRUE; frp->fr_win->w_redr_status = true;
else if (frp->fr_layout == FR_ROW) { } else if (frp->fr_layout == FR_ROW) {
for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next) FOR_ALL_FRAMES(frp, frp->fr_child) {
win_redraw_last_status(frp); win_redraw_last_status(frp);
} else { /* frp->fr_layout == FR_COL */ }
} else {
assert(frp->fr_layout == FR_COL);
frp = frp->fr_child; frp = frp->fr_child;
while (frp->fr_next != NULL) while (frp->fr_next != NULL) {
frp = frp->fr_next; frp = frp->fr_next;
}
win_redraw_last_status(frp); win_redraw_last_status(frp);
} }
} }

View File

@@ -351,7 +351,7 @@ static reg_extmatch_T *next_match_extmatch = NULL;
/* /*
* A state stack is an array of integers or stateitem_T, stored in a * A state stack is an array of integers or stateitem_T, stored in a
* garray_T. A state stack is invalid if it's itemsize entry is zero. * garray_T. A state stack is invalid if its itemsize entry is zero.
*/ */
#define INVALID_STATE(ssp) ((ssp)->ga_itemsize == 0) #define INVALID_STATE(ssp) ((ssp)->ga_itemsize == 0)
#define VALID_STATE(ssp) ((ssp)->ga_itemsize != 0) #define VALID_STATE(ssp) ((ssp)->ga_itemsize != 0)
@@ -7029,6 +7029,10 @@ static void highlight_list_one(const int id)
struct hl_group *const sgp = &HL_TABLE()[id - 1]; // index is ID minus one struct hl_group *const sgp = &HL_TABLE()[id - 1]; // index is ID minus one
bool didh = false; bool didh = false;
if (message_filtered(sgp->sg_name)) {
return;
}
didh = highlight_list_arg(id, didh, LIST_ATTR, didh = highlight_list_arg(id, didh, LIST_ATTR,
sgp->sg_cterm, NULL, "cterm"); sgp->sg_cterm, NULL, "cterm");
didh = highlight_list_arg(id, didh, LIST_INT, didh = highlight_list_arg(id, didh, LIST_INT,

View File

@@ -263,7 +263,7 @@ else
endif endif
" Names of flaky tests. " Names of flaky tests.
let s:flaky = [ let s:flaky_tests = [
\ 'Test_cursorhold_insert()', \ 'Test_cursorhold_insert()',
\ 'Test_exit_callback_interval()', \ 'Test_exit_callback_interval()',
\ 'Test_oneshot()', \ 'Test_oneshot()',
@@ -281,6 +281,9 @@ let s:flaky = [
\ 'Test_lambda_with_timer()', \ 'Test_lambda_with_timer()',
\ ] \ ]
" Pattern indicating a common flaky test failure.
let s:flaky_errors_re = 'StopVimInTerminal\|VerifyScreenDump'
" Locate Test_ functions and execute them. " Locate Test_ functions and execute them.
redir @q redir @q
silent function /^Test_ silent function /^Test_
@@ -305,7 +308,9 @@ for s:test in sort(s:tests)
" Repeat a flaky test. Give up when: " Repeat a flaky test. Give up when:
" - it fails again with the same message " - it fails again with the same message
" - it fails five times (with a different mesage) " - it fails five times (with a different mesage)
if len(v:errors) > 0 && index(s:flaky, s:test) >= 0 if len(v:errors) > 0
\ && (index(s:flaky_tests, s:test) >= 0
\ || v:errors[0] =~ s:flaky_errors_re)
while 1 while 1
call add(s:messages, 'Found errors in ' . s:test . ':') call add(s:messages, 'Found errors in ' . s:test . ':')
call extend(s:messages, v:errors) call extend(s:messages, v:errors)

View File

@@ -87,3 +87,61 @@ func Test_filter_cmd_with_filter()
call assert_equal('a|b', out) call assert_equal('a|b', out)
set shelltemp& set shelltemp&
endfunction endfunction
func Test_filter_commands()
let g:test_filter_a = 1
let b:test_filter_b = 2
let test_filter_c = 3
" Test filtering :let command
let res = split(execute("filter /^test_filter/ let"), "\n")
call assert_equal(["test_filter_a #1"], res)
let res = split(execute("filter /\\v^(b:)?test_filter/ let"), "\n")
call assert_equal(["test_filter_a #1", "b:test_filter_b #2"], res)
unlet g:test_filter_a
unlet b:test_filter_b
unlet test_filter_c
" Test filtering :set command
let helplang=&helplang
set helplang=en
let res = join(split(execute("filter /^help/ set"), "\n")[1:], " ")
call assert_match('^\s*helplang=\w*$', res)
let &helplang=helplang
" Test filtering :llist command
call setloclist(0, [{"filename": "/path/vim.c"}, {"filename": "/path/vim.h"}, {"module": "Main.Test"}])
let res = split(execute("filter /\\.c$/ llist"), "\n")
call assert_equal([" 1 /path/vim.c: "], res)
let res = split(execute("filter /\\.Test$/ llist"), "\n")
call assert_equal([" 3 Main.Test: "], res)
" Test filtering :jump command
e file.c
e file.h
e file.hs
let res = split(execute("filter /\.c$/ jumps"), "\n")[1:]
call assert_equal([" 2 1 0 file.c", ">"], res)
" Test filtering :marks command
b file.c
mark A
b file.h
mark B
let res = split(execute("filter /\.c$/ marks"), "\n")[1:]
call assert_equal([" A 1 0 file.c"], res)
call setline(1, ['one', 'two', 'three'])
1mark a
2mark b
3mark c
let res = split(execute("filter /two/ marks abc"), "\n")[1:]
call assert_equal([" b 2 0 two"], res)
bwipe! file.c
bwipe! file.h
bwipe! file.hs
endfunc

View File

@@ -53,6 +53,8 @@ func Test_suspend()
" Quit gracefully to dump coverage information. " Quit gracefully to dump coverage information.
call term_sendkeys(buf, ":qall!\<CR>") call term_sendkeys(buf, ":qall!\<CR>")
call term_wait(buf) call term_wait(buf)
" Wait until Vim actually exited and shell shows a prompt
call WaitForAssert({-> assert_match('[$#] $', term_getline(buf, '.'))})
call Stop_shell_in_terminal(buf) call Stop_shell_in_terminal(buf)
exe buf . 'bwipe!' exe buf . 'bwipe!'

View File

@@ -518,6 +518,43 @@ func Test_winrestcmd()
only only
endfunc endfunc
function! Fun_RenewFile()
sleep 2
silent execute '!echo "1" > tmp.txt'
sp
wincmd p
edit! tmp.txt
endfunction
func Test_window_prevwin()
" Can we make this work on MS-Windows?
if !has('unix')
return
endif
set hidden autoread
call writefile(['2'], 'tmp.txt')
new tmp.txt
q
" Need to wait a bit for the timestamp to be older.
call Fun_RenewFile()
call assert_equal(2, winnr())
wincmd p
call assert_equal(1, winnr())
wincmd p
q
call Fun_RenewFile()
call assert_equal(2, winnr())
wincmd p
call assert_equal(1, winnr())
wincmd p
" reset
q
call delete('tmp.txt')
set hidden&vim autoread&vim
delfunc Fun_RenewFile
endfunc
func Test_relative_cursor_position_in_one_line_window() func Test_relative_cursor_position_in_one_line_window()
new new
only only

View File

@@ -1024,7 +1024,7 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir)
for (frp = oldwin->w_frame->fr_parent; frp != NULL; for (frp = oldwin->w_frame->fr_parent; frp != NULL;
frp = frp->fr_parent) { frp = frp->fr_parent) {
if (frp->fr_layout == FR_ROW) { if (frp->fr_layout == FR_ROW) {
for (frp2 = frp->fr_child; frp2 != NULL; frp2 = frp2->fr_next) { FOR_ALL_FRAMES(frp2, frp->fr_child) {
if (frp2 != prevfrp) { if (frp2 != prevfrp) {
minwidth += frame_minwidth(frp2, NOWIN); minwidth += frame_minwidth(frp2, NOWIN);
} }
@@ -1102,7 +1102,7 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir)
for (frp = oldwin->w_frame->fr_parent; frp != NULL; for (frp = oldwin->w_frame->fr_parent; frp != NULL;
frp = frp->fr_parent) { frp = frp->fr_parent) {
if (frp->fr_layout == FR_COL) { if (frp->fr_layout == FR_COL) {
for (frp2 = frp->fr_child; frp2 != NULL; frp2 = frp2->fr_next) { FOR_ALL_FRAMES(frp2, frp->fr_child) {
if (frp2 != prevfrp) { if (frp2 != prevfrp) {
minheight += frame_minheight(frp2, NOWIN); minheight += frame_minheight(frp2, NOWIN);
} }
@@ -1247,12 +1247,14 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir)
curfrp->fr_child = frp; curfrp->fr_child = frp;
curfrp->fr_win = NULL; curfrp->fr_win = NULL;
curfrp = frp; curfrp = frp;
if (frp->fr_win != NULL) if (frp->fr_win != NULL) {
oldwin->w_frame = frp; oldwin->w_frame = frp;
else } else {
for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next) FOR_ALL_FRAMES(frp, frp->fr_child) {
frp->fr_parent = curfrp; frp->fr_parent = curfrp;
} }
}
}
if (new_wp == NULL) if (new_wp == NULL)
frp = wp->w_frame; frp = wp->w_frame;
@@ -1717,13 +1719,13 @@ static void win_rotate(bool upwards, int count)
return; return;
} }
/* Check if all frames in this row/col have one window. */ // Check if all frames in this row/col have one window.
for (frp = curwin->w_frame->fr_parent->fr_child; frp != NULL; FOR_ALL_FRAMES(frp, curwin->w_frame->fr_parent->fr_child) {
frp = frp->fr_next)
if (frp->fr_win == NULL) { if (frp->fr_win == NULL) {
EMSG(_("E443: Cannot rotate when another window is split")); EMSG(_("E443: Cannot rotate when another window is split"));
return; return;
} }
}
while (count--) { while (count--) {
if (upwards) { /* first window becomes last window */ if (upwards) { /* first window becomes last window */
@@ -1961,10 +1963,10 @@ static void win_equal_rec(
room = 0; room = 0;
} else { } else {
next_curwin_size = -1; next_curwin_size = -1;
for (fr = topfr->fr_child; fr != NULL; fr = fr->fr_next) { FOR_ALL_FRAMES(fr, topfr->fr_child) {
/* If 'winfixwidth' set keep the window width if // If 'winfixwidth' set keep the window width if
* possible. // possible.
* Watch out for this window being the next_curwin. */ // Watch out for this window being the next_curwin.
if (!frame_fixed_width(fr)) { if (!frame_fixed_width(fr)) {
continue; continue;
} }
@@ -2007,7 +2009,7 @@ static void win_equal_rec(
--totwincount; /* don't count curwin */ --totwincount; /* don't count curwin */
} }
for (fr = topfr->fr_child; fr != NULL; fr = fr->fr_next) { FOR_ALL_FRAMES(fr, topfr->fr_child) {
wincount = 1; wincount = 1;
if (fr->fr_next == NULL) if (fr->fr_next == NULL)
/* last frame gets all that remains (avoid roundoff error) */ /* last frame gets all that remains (avoid roundoff error) */
@@ -2082,10 +2084,10 @@ static void win_equal_rec(
room = 0; room = 0;
} else { } else {
next_curwin_size = -1; next_curwin_size = -1;
for (fr = topfr->fr_child; fr != NULL; fr = fr->fr_next) { FOR_ALL_FRAMES(fr, topfr->fr_child) {
/* If 'winfixheight' set keep the window height if // If 'winfixheight' set keep the window height if
* possible. // possible.
* Watch out for this window being the next_curwin. */ // Watch out for this window being the next_curwin.
if (!frame_fixed_height(fr)) { if (!frame_fixed_height(fr)) {
continue; continue;
} }
@@ -2128,7 +2130,7 @@ static void win_equal_rec(
--totwincount; /* don't count curwin */ --totwincount; /* don't count curwin */
} }
for (fr = topfr->fr_child; fr != NULL; fr = fr->fr_next) { FOR_ALL_FRAMES(fr, topfr->fr_child) {
wincount = 1; wincount = 1;
if (fr->fr_next == NULL) if (fr->fr_next == NULL)
/* last frame gets all that remains (avoid roundoff error) */ /* last frame gets all that remains (avoid roundoff error) */
@@ -2815,8 +2817,9 @@ winframe_remove (
* and remove it. */ * and remove it. */
frp2->fr_parent->fr_layout = frp2->fr_layout; frp2->fr_parent->fr_layout = frp2->fr_layout;
frp2->fr_parent->fr_child = frp2->fr_child; frp2->fr_parent->fr_child = frp2->fr_child;
for (frp = frp2->fr_child; frp != NULL; frp = frp->fr_next) FOR_ALL_FRAMES(frp, frp2->fr_child) {
frp->fr_parent = frp2->fr_parent; frp->fr_parent = frp2->fr_parent;
}
frp2->fr_parent->fr_win = frp2->fr_win; frp2->fr_parent->fr_win = frp2->fr_win;
if (frp2->fr_win != NULL) if (frp2->fr_win != NULL)
frp2->fr_win->w_frame = frp2->fr_parent; frp2->fr_win->w_frame = frp2->fr_parent;
@@ -2937,13 +2940,14 @@ static win_T *frame2win(frame_T *frp)
/// ///
/// @param frp frame /// @param frp frame
/// @param wp window /// @param wp window
static bool frame_has_win(frame_T *frp, win_T *wp) static bool frame_has_win(const frame_T *frp, const win_T *wp)
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ARG(1) FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ARG(1)
{ {
if (frp->fr_layout == FR_LEAF) { if (frp->fr_layout == FR_LEAF) {
return frp->fr_win == wp; return frp->fr_win == wp;
} }
for (frame_T *p = frp->fr_child; p != NULL; p = p->fr_next) { const frame_T *p;
FOR_ALL_FRAMES(p, frp->fr_child) {
if (frame_has_win(p, wp)) { if (frame_has_win(p, wp)) {
return true; return true;
} }
@@ -2974,8 +2978,8 @@ frame_new_height (
height - topfrp->fr_win->w_status_height); height - topfrp->fr_win->w_status_height);
} else if (topfrp->fr_layout == FR_ROW) { } else if (topfrp->fr_layout == FR_ROW) {
do { do {
/* All frames in this row get the same new height. */ // All frames in this row get the same new height.
for (frp = topfrp->fr_child; frp != NULL; frp = frp->fr_next) { FOR_ALL_FRAMES(frp, topfrp->fr_child) {
frame_new_height(frp, height, topfirst, wfh); frame_new_height(frp, height, topfirst, wfh);
if (frp->fr_height > height) { if (frp->fr_height > height) {
/* Could not fit the windows, make the whole row higher. */ /* Could not fit the windows, make the whole row higher. */
@@ -3056,7 +3060,7 @@ static bool frame_fixed_height(frame_T *frp)
if (frp->fr_layout == FR_ROW) { if (frp->fr_layout == FR_ROW) {
// The frame is fixed height if one of the frames in the row is fixed // The frame is fixed height if one of the frames in the row is fixed
// height. // height.
for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next) { FOR_ALL_FRAMES(frp, frp->fr_child) {
if (frame_fixed_height(frp)) { if (frame_fixed_height(frp)) {
return true; return true;
} }
@@ -3066,7 +3070,7 @@ static bool frame_fixed_height(frame_T *frp)
// frp->fr_layout == FR_COL: The frame is fixed height if all of the // frp->fr_layout == FR_COL: The frame is fixed height if all of the
// frames in the row are fixed height. // frames in the row are fixed height.
for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next) { FOR_ALL_FRAMES(frp, frp->fr_child) {
if (!frame_fixed_height(frp)) { if (!frame_fixed_height(frp)) {
return false; return false;
} }
@@ -3090,7 +3094,7 @@ static bool frame_fixed_width(frame_T *frp)
if (frp->fr_layout == FR_COL) { if (frp->fr_layout == FR_COL) {
// The frame is fixed width if one of the frames in the row is fixed // The frame is fixed width if one of the frames in the row is fixed
// width. // width.
for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next) { FOR_ALL_FRAMES(frp, frp->fr_child) {
if (frame_fixed_width(frp)) { if (frame_fixed_width(frp)) {
return true; return true;
} }
@@ -3100,7 +3104,7 @@ static bool frame_fixed_width(frame_T *frp)
// frp->fr_layout == FR_ROW: The frame is fixed width if all of the // frp->fr_layout == FR_ROW: The frame is fixed width if all of the
// frames in the row are fixed width. // frames in the row are fixed width.
for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next) { FOR_ALL_FRAMES(frp, frp->fr_child) {
if (!frame_fixed_width(frp)) { if (!frame_fixed_width(frp)) {
return false; return false;
} }
@@ -3124,13 +3128,15 @@ static void frame_add_statusline(frame_T *frp)
wp->w_status_height = STATUS_HEIGHT; wp->w_status_height = STATUS_HEIGHT;
} }
} else if (frp->fr_layout == FR_ROW) { } else if (frp->fr_layout == FR_ROW) {
/* Handle all the frames in the row. */ // Handle all the frames in the row.
for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next) FOR_ALL_FRAMES(frp, frp->fr_child) {
frame_add_statusline(frp); frame_add_statusline(frp);
} else { /* frp->fr_layout == FR_COL */ }
/* Only need to handle the last frame in the column. */ } else {
for (frp = frp->fr_child; frp->fr_next != NULL; frp = frp->fr_next) assert(frp->fr_layout == FR_COL);
; // Only need to handle the last frame in the column.
for (frp = frp->fr_child; frp->fr_next != NULL; frp = frp->fr_next) {
}
frame_add_statusline(frp); frame_add_statusline(frp);
} }
} }
@@ -3165,8 +3171,8 @@ frame_new_width (
win_new_width(wp, width - wp->w_vsep_width); win_new_width(wp, width - wp->w_vsep_width);
} else if (topfrp->fr_layout == FR_COL) { } else if (topfrp->fr_layout == FR_COL) {
do { do {
/* All frames in this column get the same new width. */ // All frames in this column get the same new width.
for (frp = topfrp->fr_child; frp != NULL; frp = frp->fr_next) { FOR_ALL_FRAMES(frp, topfrp->fr_child) {
frame_new_width(frp, width, leftfirst, wfw); frame_new_width(frp, width, leftfirst, wfw);
if (frp->fr_width > width) { if (frp->fr_width > width) {
/* Could not fit the windows, make whole column wider. */ /* Could not fit the windows, make whole column wider. */
@@ -3235,7 +3241,8 @@ frame_new_width (
* Add the vertical separator to windows at the right side of "frp". * Add the vertical separator to windows at the right side of "frp".
* Note: Does not check if there is room! * Note: Does not check if there is room!
*/ */
static void frame_add_vsep(frame_T *frp) static void frame_add_vsep(const frame_T *frp)
FUNC_ATTR_NONNULL_ARG(1)
{ {
win_T *wp; win_T *wp;
@@ -3247,11 +3254,13 @@ static void frame_add_vsep(frame_T *frp)
wp->w_vsep_width = 1; wp->w_vsep_width = 1;
} }
} else if (frp->fr_layout == FR_COL) { } else if (frp->fr_layout == FR_COL) {
/* Handle all the frames in the column. */ // Handle all the frames in the column.
for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next) FOR_ALL_FRAMES(frp, frp->fr_child) {
frame_add_vsep(frp); frame_add_vsep(frp);
} else { /* frp->fr_layout == FR_ROW */ }
/* Only need to handle the last frame in the row. */ } else {
assert(frp->fr_layout == FR_ROW);
// Only need to handle the last frame in the row.
frp = frp->fr_child; frp = frp->fr_child;
while (frp->fr_next != NULL) while (frp->fr_next != NULL)
frp = frp->fr_next; frp = frp->fr_next;
@@ -3301,7 +3310,7 @@ static int frame_minheight(frame_T *topfrp, win_T *next_curwin)
} else if (topfrp->fr_layout == FR_ROW) { } else if (topfrp->fr_layout == FR_ROW) {
/* get the minimal height from each frame in this row */ /* get the minimal height from each frame in this row */
m = 0; m = 0;
for (frp = topfrp->fr_child; frp != NULL; frp = frp->fr_next) { FOR_ALL_FRAMES(frp, topfrp->fr_child) {
n = frame_minheight(frp, next_curwin); n = frame_minheight(frp, next_curwin);
if (n > m) if (n > m)
m = n; m = n;
@@ -3309,9 +3318,10 @@ static int frame_minheight(frame_T *topfrp, win_T *next_curwin)
} else { } else {
/* Add up the minimal heights for all frames in this column. */ /* Add up the minimal heights for all frames in this column. */
m = 0; m = 0;
for (frp = topfrp->fr_child; frp != NULL; frp = frp->fr_next) FOR_ALL_FRAMES(frp, topfrp->fr_child) {
m += frame_minheight(frp, next_curwin); m += frame_minheight(frp, next_curwin);
} }
}
return m; return m;
} }
@@ -3344,7 +3354,7 @@ frame_minwidth (
} else if (topfrp->fr_layout == FR_COL) { } else if (topfrp->fr_layout == FR_COL) {
/* get the minimal width from each frame in this column */ /* get the minimal width from each frame in this column */
m = 0; m = 0;
for (frp = topfrp->fr_child; frp != NULL; frp = frp->fr_next) { FOR_ALL_FRAMES(frp, topfrp->fr_child) {
n = frame_minwidth(frp, next_curwin); n = frame_minwidth(frp, next_curwin);
if (n > m) if (n > m)
m = n; m = n;
@@ -3352,9 +3362,10 @@ frame_minwidth (
} else { } else {
/* Add up the minimal widths for all frames in this row. */ /* Add up the minimal widths for all frames in this row. */
m = 0; m = 0;
for (frp = topfrp->fr_child; frp != NULL; frp = frp->fr_next) FOR_ALL_FRAMES(frp, topfrp->fr_child) {
m += frame_minwidth(frp, next_curwin); m += frame_minwidth(frp, next_curwin);
} }
}
return m; return m;
} }
@@ -4830,11 +4841,12 @@ static void frame_comp_pos(frame_T *topfrp, int *row, int *col)
} else { } else {
startrow = *row; startrow = *row;
startcol = *col; startcol = *col;
for (frp = topfrp->fr_child; frp != NULL; frp = frp->fr_next) { FOR_ALL_FRAMES(frp, topfrp->fr_child) {
if (topfrp->fr_layout == FR_ROW) if (topfrp->fr_layout == FR_ROW) {
*row = startrow; /* all frames are at the same row */ *row = startrow; // all frames are at the same row
else } else {
*col = startcol; /* all frames are at the same col */ *col = startcol; // all frames are at the same col
}
frame_comp_pos(frp, row, col); frame_comp_pos(frp, row, col);
} }
} }
@@ -4943,16 +4955,17 @@ static void frame_setheight(frame_T *curfrp, int height)
for (run = 1; run <= 2; ++run) { for (run = 1; run <= 2; ++run) {
room = 0; room = 0;
room_reserved = 0; room_reserved = 0;
for (frp = curfrp->fr_parent->fr_child; frp != NULL; FOR_ALL_FRAMES(frp, curfrp->fr_parent->fr_child) {
frp = frp->fr_next) {
if (frp != curfrp if (frp != curfrp
&& frp->fr_win != NULL && frp->fr_win != NULL
&& frp->fr_win->w_p_wfh) && frp->fr_win->w_p_wfh) {
room_reserved += frp->fr_height; room_reserved += frp->fr_height;
}
room += frp->fr_height; room += frp->fr_height;
if (frp != curfrp) if (frp != curfrp) {
room -= frame_minheight(frp, NULL); room -= frame_minheight(frp, NULL);
} }
}
if (curfrp->fr_width != Columns) { if (curfrp->fr_width != Columns) {
room_cmdline = 0; room_cmdline = 0;
} else { } else {
@@ -5124,16 +5137,17 @@ static void frame_setwidth(frame_T *curfrp, int width)
for (run = 1; run <= 2; ++run) { for (run = 1; run <= 2; ++run) {
room = 0; room = 0;
room_reserved = 0; room_reserved = 0;
for (frp = curfrp->fr_parent->fr_child; frp != NULL; FOR_ALL_FRAMES(frp, curfrp->fr_parent->fr_child) {
frp = frp->fr_next) {
if (frp != curfrp if (frp != curfrp
&& frp->fr_win != NULL && frp->fr_win != NULL
&& frp->fr_win->w_p_wfw) && frp->fr_win->w_p_wfw) {
room_reserved += frp->fr_width; room_reserved += frp->fr_width;
}
room += frp->fr_width; room += frp->fr_width;
if (frp != curfrp) if (frp != curfrp) {
room -= frame_minwidth(frp, NULL); room -= frame_minwidth(frp, NULL);
} }
}
if (width <= room) if (width <= room)
break; break;
@@ -5296,10 +5310,11 @@ void win_drag_status_line(win_T *dragwin, int offset)
room -= p_ch; room -= p_ch;
if (room < 0) if (room < 0)
room = 0; room = 0;
/* sum up the room of frames below of the current one */ // sum up the room of frames below of the current one
for (fr = curfr->fr_next; fr != NULL; fr = fr->fr_next) FOR_ALL_FRAMES(fr, curfr->fr_next) {
room += fr->fr_height - frame_minheight(fr, NULL); room += fr->fr_height - frame_minheight(fr, NULL);
fr = curfr; /* put fr at window that grows */ }
fr = curfr; // put fr at window that grows
} }
if (room < offset) /* Not enough room */ if (room < offset) /* Not enough room */
@@ -5399,9 +5414,10 @@ void win_drag_vsep_line(win_T *dragwin, int offset)
left = FALSE; left = FALSE;
/* sum up the room of frames right of the current one */ /* sum up the room of frames right of the current one */
room = 0; room = 0;
for (fr = curfr->fr_next; fr != NULL; fr = fr->fr_next) FOR_ALL_FRAMES(fr, curfr->fr_next) {
room += fr->fr_width - frame_minwidth(fr, NULL); room += fr->fr_width - frame_minwidth(fr, NULL);
fr = curfr; /* put fr at window that grows */ }
fr = curfr; // put fr at window that grows
} }
assert(fr); assert(fr);
@@ -5933,9 +5949,10 @@ static void last_status_rec(frame_T *fr, int statusline)
redraw_all_later(SOME_VALID); redraw_all_later(SOME_VALID);
} }
} else if (fr->fr_layout == FR_ROW) { } else if (fr->fr_layout == FR_ROW) {
/* vertically split windows, set status line for each one */ // vertically split windows, set status line for each one
for (fp = fr->fr_child; fp != NULL; fp = fp->fr_next) FOR_ALL_FRAMES(fp, fr->fr_child) {
last_status_rec(fp, statusline); last_status_rec(fp, statusline);
}
} else { } else {
/* horizontally split window, set status line for last one */ /* horizontally split window, set status line for last one */
for (fp = fr->fr_child; fp->fr_next != NULL; fp = fp->fr_next) for (fp = fr->fr_child; fp->fr_next != NULL; fp = fp->fr_next)
@@ -6551,14 +6568,15 @@ matchitem_T *get_match(win_T *wp, int id)
/// ///
/// @param topfrp top frame pointer /// @param topfrp top frame pointer
/// @param height expected height /// @param height expected height
static bool frame_check_height(frame_T *topfrp, int height) static bool frame_check_height(const frame_T *topfrp, int height)
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
{ {
if (topfrp->fr_height != height) { if (topfrp->fr_height != height) {
return false; return false;
} }
if (topfrp->fr_layout == FR_ROW) { if (topfrp->fr_layout == FR_ROW) {
for (frame_T *frp = topfrp->fr_child; frp != NULL; frp = frp->fr_next) { const frame_T *frp;
FOR_ALL_FRAMES(frp, topfrp->fr_child) {
if (frp->fr_height != height) { if (frp->fr_height != height) {
return false; return false;
} }
@@ -6571,14 +6589,15 @@ static bool frame_check_height(frame_T *topfrp, int height)
/// ///
/// @param topfrp top frame pointer /// @param topfrp top frame pointer
/// @param width expected width /// @param width expected width
static bool frame_check_width(frame_T *topfrp, int width) static bool frame_check_width(const frame_T *topfrp, int width)
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL
{ {
if (topfrp->fr_width != width) { if (topfrp->fr_width != width) {
return false; return false;
} }
if (topfrp->fr_layout == FR_COL) { if (topfrp->fr_layout == FR_COL) {
for (frame_T *frp = topfrp->fr_child; frp != NULL; frp = frp->fr_next) { const frame_T *frp;
FOR_ALL_FRAMES(frp, topfrp->fr_child) {
if (frp->fr_width != width) { if (frp->fr_width != width) {
return false; return false;
} }