diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2019-07-16 19:52:23 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-16 19:52:23 +0200 |
commit | b35ad8602402d5fbd67936ab12f660525228220a (patch) | |
tree | c0790515b9d64dcfa7a2e6e9c7886dee73829beb /src | |
parent | b9a2b3f01424e6f10a6134675e8fe7f96734bccf (diff) | |
parent | 64f4ee39aac06c405d87256b588eb9dff8fb3c57 (diff) | |
download | rneovim-b35ad8602402d5fbd67936ab12f660525228220a.tar.gz rneovim-b35ad8602402d5fbd67936ab12f660525228220a.tar.bz2 rneovim-b35ad8602402d5fbd67936ab12f660525228220a.zip |
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}
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/eval.c | 17 | ||||
-rw-r--r-- | src/nvim/ex_docmd.c | 30 | ||||
-rw-r--r-- | src/nvim/globals.h | 9 | ||||
-rw-r--r-- | src/nvim/mark.c | 73 | ||||
-rw-r--r-- | src/nvim/normal.c | 23 | ||||
-rw-r--r-- | src/nvim/option.c | 5 | ||||
-rw-r--r-- | src/nvim/regexp_nfa.c | 4 | ||||
-rw-r--r-- | src/nvim/screen.c | 18 | ||||
-rw-r--r-- | src/nvim/syntax.c | 6 | ||||
-rw-r--r-- | src/nvim/testdir/runtest.vim | 9 | ||||
-rw-r--r-- | src/nvim/testdir/test_filter_cmd.vim | 58 | ||||
-rw-r--r-- | src/nvim/testdir/test_suspend.vim | 2 | ||||
-rw-r--r-- | src/nvim/testdir/test_window_cmd.vim | 37 | ||||
-rw-r--r-- | src/nvim/window.c | 155 |
14 files changed, 304 insertions, 142 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 6a5149614b..67aaf3c25c 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -1782,6 +1782,15 @@ static void list_hashtable_vars(hashtab_T *ht, const char *prefix, int empty, if (!HASHITEM_EMPTY(hi)) { todo--; 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 || di->di_tv.vval.v_string != NULL) { 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. */ if (lp->ll_dict == &vimvardict) { EMSG2(_(e_illvar), name); + tv_clear(&var1); return NULL; } @@ -4326,7 +4336,7 @@ static int eval7( // Dictionary: {key: val, key: val} case '{': ret = get_lambda_tv(arg, rettv, evaluate); if (ret == NOTDONE) { - ret = get_dict_tv(arg, rettv, evaluate); + ret = dict_get_tv(arg, rettv, evaluate); } 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". * 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; typval_T tvkey; @@ -20851,6 +20861,9 @@ void ex_function(exarg_T *eap) if (!HASHITEM_EMPTY(hi)) { --todo; fp = HI2UF(hi); + if (message_filtered(fp->uf_name)) { + continue; + } if (!func_name_refcount(fp->uf_name)) { list_func_head(fp, false); } diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 4d28afd792..072f2fab40 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -9322,26 +9322,30 @@ static frame_T *ses_skipframe(frame_T *fr) { frame_T *frc; - for (frc = fr; frc != NULL; frc = frc->fr_next) - if (ses_do_frame(frc)) + FOR_ALL_FRAMES(frc, fr) { + if (ses_do_frame(frc)) { break; + } + } return frc; } -/* - * Return TRUE if frame "fr" has a window somewhere that we want to save in - * the Session. - */ -static int ses_do_frame(frame_T *fr) +// Return true if frame "fr" has a window somewhere that we want to save in +// the Session. +static bool ses_do_frame(const frame_T *fr) + FUNC_ATTR_NONNULL_ARG(1) { - 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); - for (frc = fr->fr_child; frc != NULL; frc = frc->fr_next) - if (ses_do_frame(frc)) - return TRUE; - return FALSE; + } + FOR_ALL_FRAMES(frc, fr->fr_child) { + if (ses_do_frame(frc)) { + return true; + } + } + return false; } /// Return non-zero if window "wp" is to be stored in the Session. diff --git a/src/nvim/globals.h b/src/nvim/globals.h index 139ffe2144..1cb2f4592a 100644 --- a/src/nvim/globals.h +++ b/src/nvim/globals.h @@ -435,10 +435,11 @@ EXTERN win_T *firstwin; /* first window */ EXTERN win_T *lastwin; /* last window */ EXTERN win_T *prevwin INIT(= NULL); /* previous window */ # define ONE_WINDOW (firstwin == lastwin) -/* - * When using this macro "break" only breaks out of the inner loop. Use "goto" - * to break out of the tabpage loop. - */ +# define FOR_ALL_FRAMES(frp, first_frame) \ + for (frp = first_frame; frp != NULL; frp = frp->fr_next) // NOLINT + +// 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) \ FOR_ALL_TABS(tp) \ FOR_ALL_WINDOWS_IN_TAB(wp, tp) diff --git a/src/nvim/mark.c b/src/nvim/mark.c index 2f2f2a7d74..3736004527 100644 --- a/src/nvim/mark.c +++ b/src/nvim/mark.c @@ -656,48 +656,51 @@ show_one_mark( int c, char_u *arg, pos_T *p, - char_u *name, - int current /* in current file */ + char_u *name_arg, + int current // in current file ) { - static int did_title = FALSE; - int mustfree = FALSE; - - if (c == -1) { /* finish up */ - if (did_title) - did_title = FALSE; - else { - if (arg == NULL) + static bool did_title = false; + bool mustfree = false; + char_u *name = name_arg; + + if (c == -1) { // finish up + if (did_title) { + did_title = false; + } else { + if (arg == NULL) { MSG(_("No marks set")); - else + } else { EMSG2(_("E283: No marks matching \"%s\""), arg); + } } - } - /* don't output anything if 'q' typed at --more-- prompt */ - else if (!got_int - && (arg == NULL || vim_strchr(arg, c) != NULL) - && p->lnum != 0) { - if (!did_title) { - /* Highlight title */ - MSG_PUTS_TITLE(_("\nmark line col file/text")); - did_title = TRUE; + } else if (!got_int + && (arg == NULL || vim_strchr(arg, c) != NULL) + && p->lnum != 0) { + // don't output anything if 'q' typed at --more-- prompt + if (name == NULL && current) { + name = mark_line(p, 15); + mustfree = true; } - msg_putchar('\n'); - if (!got_int) { - sprintf((char *)IObuff, " %c %6ld %4d ", c, p->lnum, p->col); - msg_outtrans(IObuff); - if (name == NULL && current) { - name = mark_line(p, 15); - mustfree = TRUE; + if (!message_filtered(name)) { + if (!did_title) { + // Highlight title + msg_puts_title(_("\nmark line col file/text")); + did_title = true; } - if (name != NULL) { - msg_outtrans_attr(name, current ? HL_ATTR(HLF_D) : 0); - if (mustfree) { - xfree(name); + msg_putchar('\n'); + if (!got_int) { + snprintf((char *)IObuff, IOSIZE, " %c %6ld %4d ", c, p->lnum, p->col); + msg_outtrans(IObuff); + if (name != NULL) { + msg_outtrans_attr(name, current ? HL_ATTR(HLF_D) : 0); } } + ui_flush(); // show one line at a time + } + if (mustfree) { + 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) { if (curwin->w_jumplist[i].fmark.mark.lnum != 0) { 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; + } msg_putchar('\n'); if (got_int) { diff --git a/src/nvim/normal.c b/src/nvim/normal.c index de8ff52fe1..4ef4b69def 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -1376,9 +1376,8 @@ static void set_vcount_ca(cmdarg_T *cap, bool *set_prevcount) *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) { 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 ((finish_op - || VIsual_active - ) && oap->op_type != OP_NOP) { + || VIsual_active) + && 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 if (curwin->w_p_lbr) { 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; } - /* Only redo yank when 'y' flag is in 'cpoptions'. */ - /* Never redo "zf" (define fold). */ - if ((vim_strchr(p_cpo, CPO_YANK) != NULL || oap->op_type != OP_YANK) + // Only redo yank when 'y' flag is in 'cpoptions'. + // Never redo "zf" (define fold). + if ((redo_yank || oap->op_type != OP_YANK) && ((!VIsual_active || oap->motion_force) // Also redo Operator-pending Visual mode mappings. || (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; } - /* can't redo yank (unless 'y' is in 'cpoptions') and ":" */ - if ((vim_strchr(p_cpo, CPO_YANK) != NULL || oap->op_type != OP_YANK) + // can't redo yank (unless 'y' is in 'cpoptions') and ":" + if ((redo_yank || oap->op_type != OP_YANK) && oap->op_type != OP_COLON && oap->op_type != OP_FOLD && oap->op_type != OP_FOLDOPEN diff --git a/src/nvim/option.c b/src/nvim/option.c index d6dbb14653..8483c02bbe 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -5047,6 +5047,11 @@ showoptions( // collect the items in items[] item_count = 0; for (p = &options[0]; p->fullname != NULL; p++) { + // apply :filter /pat/ + if (message_filtered((char_u *)p->fullname)) { + continue; + } + varp = NULL; if (opt_flags != 0) { if (p->indir != PV_NONE) { diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c index dc1ab971ab..a28e05bd7e 100644 --- a/src/nvim/regexp_nfa.c +++ b/src/nvim/regexp_nfa.c @@ -3002,8 +3002,8 @@ static nfa_state_T *post2nfa(int *postfix, int *end, int nfa_calc_size) return NULL; \ } - if (nfa_calc_size == FALSE) { - /* Allocate space for the stack. Max states on the stack : nstate */ + if (nfa_calc_size == false) { + // Allocate space for the stack. Max states on the stack: "nstate". stack = xmalloc((nstate + 1) * sizeof(Frag_T)); stackp = stack; stack_end = stack + (nstate + 1); diff --git a/src/nvim/screen.c b/src/nvim/screen.c index 553008c010..2f8b1b6b02 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -4571,17 +4571,21 @@ void redraw_statuslines(void) /* * 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) - frp->fr_win->w_redr_status = TRUE; - else if (frp->fr_layout == FR_ROW) { - for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next) + if (frp->fr_layout == FR_LEAF) { + frp->fr_win->w_redr_status = true; + } else if (frp->fr_layout == FR_ROW) { + FOR_ALL_FRAMES(frp, frp->fr_child) { win_redraw_last_status(frp); - } else { /* frp->fr_layout == FR_COL */ + } + } else { + assert(frp->fr_layout == FR_COL); frp = frp->fr_child; - while (frp->fr_next != NULL) + while (frp->fr_next != NULL) { frp = frp->fr_next; + } win_redraw_last_status(frp); } } diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c index 192cf9cb75..84392680c5 100644 --- a/src/nvim/syntax.c +++ b/src/nvim/syntax.c @@ -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 - * 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 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 bool didh = false; + if (message_filtered(sgp->sg_name)) { + return; + } + didh = highlight_list_arg(id, didh, LIST_ATTR, sgp->sg_cterm, NULL, "cterm"); didh = highlight_list_arg(id, didh, LIST_INT, diff --git a/src/nvim/testdir/runtest.vim b/src/nvim/testdir/runtest.vim index 605e7c73eb..009908ec09 100644 --- a/src/nvim/testdir/runtest.vim +++ b/src/nvim/testdir/runtest.vim @@ -263,7 +263,7 @@ else endif " Names of flaky tests. -let s:flaky = [ +let s:flaky_tests = [ \ 'Test_cursorhold_insert()', \ 'Test_exit_callback_interval()', \ 'Test_oneshot()', @@ -281,6 +281,9 @@ let s:flaky = [ \ 'Test_lambda_with_timer()', \ ] +" Pattern indicating a common flaky test failure. +let s:flaky_errors_re = 'StopVimInTerminal\|VerifyScreenDump' + " Locate Test_ functions and execute them. redir @q silent function /^Test_ @@ -305,7 +308,9 @@ for s:test in sort(s:tests) " Repeat a flaky test. Give up when: " - it fails again with the same message " - 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 call add(s:messages, 'Found errors in ' . s:test . ':') call extend(s:messages, v:errors) diff --git a/src/nvim/testdir/test_filter_cmd.vim b/src/nvim/testdir/test_filter_cmd.vim index 86347ab77f..0c45db049b 100644 --- a/src/nvim/testdir/test_filter_cmd.vim +++ b/src/nvim/testdir/test_filter_cmd.vim @@ -87,3 +87,61 @@ func Test_filter_cmd_with_filter() call assert_equal('a|b', out) set shelltemp& 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 diff --git a/src/nvim/testdir/test_suspend.vim b/src/nvim/testdir/test_suspend.vim index efda68de9b..ef5a96bd72 100644 --- a/src/nvim/testdir/test_suspend.vim +++ b/src/nvim/testdir/test_suspend.vim @@ -53,6 +53,8 @@ func Test_suspend() " Quit gracefully to dump coverage information. call term_sendkeys(buf, ":qall!\<CR>") 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) exe buf . 'bwipe!' diff --git a/src/nvim/testdir/test_window_cmd.vim b/src/nvim/testdir/test_window_cmd.vim index 003a23ea7b..2a07a04401 100644 --- a/src/nvim/testdir/test_window_cmd.vim +++ b/src/nvim/testdir/test_window_cmd.vim @@ -518,6 +518,43 @@ func Test_winrestcmd() only 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() new only diff --git a/src/nvim/window.c b/src/nvim/window.c index 6ce095f976..38246bfe2a 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -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; frp = frp->fr_parent) { 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) { 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; frp = frp->fr_parent) { 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) { minheight += frame_minheight(frp2, NOWIN); } @@ -1247,11 +1247,13 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) curfrp->fr_child = frp; curfrp->fr_win = NULL; curfrp = frp; - if (frp->fr_win != NULL) + if (frp->fr_win != NULL) { oldwin->w_frame = frp; - else - for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next) + } else { + FOR_ALL_FRAMES(frp, frp->fr_child) { frp->fr_parent = curfrp; + } + } } if (new_wp == NULL) @@ -1717,13 +1719,13 @@ static void win_rotate(bool upwards, int count) return; } - /* Check if all frames in this row/col have one window. */ - for (frp = curwin->w_frame->fr_parent->fr_child; frp != NULL; - frp = frp->fr_next) + // Check if all frames in this row/col have one window. + FOR_ALL_FRAMES(frp, curwin->w_frame->fr_parent->fr_child) { if (frp->fr_win == NULL) { EMSG(_("E443: Cannot rotate when another window is split")); return; } + } while (count--) { if (upwards) { /* first window becomes last window */ @@ -1961,10 +1963,10 @@ static void win_equal_rec( room = 0; } else { next_curwin_size = -1; - for (fr = topfr->fr_child; fr != NULL; fr = fr->fr_next) { - /* If 'winfixwidth' set keep the window width if - * possible. - * Watch out for this window being the next_curwin. */ + FOR_ALL_FRAMES(fr, topfr->fr_child) { + // If 'winfixwidth' set keep the window width if + // possible. + // Watch out for this window being the next_curwin. if (!frame_fixed_width(fr)) { continue; } @@ -2007,7 +2009,7 @@ static void win_equal_rec( --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; if (fr->fr_next == NULL) /* last frame gets all that remains (avoid roundoff error) */ @@ -2082,10 +2084,10 @@ static void win_equal_rec( room = 0; } else { next_curwin_size = -1; - for (fr = topfr->fr_child; fr != NULL; fr = fr->fr_next) { - /* If 'winfixheight' set keep the window height if - * possible. - * Watch out for this window being the next_curwin. */ + FOR_ALL_FRAMES(fr, topfr->fr_child) { + // If 'winfixheight' set keep the window height if + // possible. + // Watch out for this window being the next_curwin. if (!frame_fixed_height(fr)) { continue; } @@ -2128,7 +2130,7 @@ static void win_equal_rec( --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; if (fr->fr_next == NULL) /* last frame gets all that remains (avoid roundoff error) */ @@ -2815,8 +2817,9 @@ winframe_remove ( * and remove it. */ frp2->fr_parent->fr_layout = frp2->fr_layout; 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; + } frp2->fr_parent->fr_win = frp2->fr_win; if (frp2->fr_win != NULL) frp2->fr_win->w_frame = frp2->fr_parent; @@ -2937,13 +2940,14 @@ static win_T *frame2win(frame_T *frp) /// /// @param frp frame /// @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) { if (frp->fr_layout == FR_LEAF) { 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)) { return true; } @@ -2974,8 +2978,8 @@ frame_new_height ( height - topfrp->fr_win->w_status_height); } else if (topfrp->fr_layout == FR_ROW) { do { - /* All frames in this row get the same new height. */ - for (frp = topfrp->fr_child; frp != NULL; frp = frp->fr_next) { + // All frames in this row get the same new height. + FOR_ALL_FRAMES(frp, topfrp->fr_child) { frame_new_height(frp, height, topfirst, wfh); if (frp->fr_height > height) { /* 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) { // The frame is fixed height if one of the frames in the row is 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)) { 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 // 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)) { return false; } @@ -3090,7 +3094,7 @@ static bool frame_fixed_width(frame_T *frp) if (frp->fr_layout == FR_COL) { // The frame is fixed width if one of the frames in the row is 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)) { 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 // 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)) { return false; } @@ -3124,13 +3128,15 @@ static void frame_add_statusline(frame_T *frp) wp->w_status_height = STATUS_HEIGHT; } } else if (frp->fr_layout == FR_ROW) { - /* Handle all the frames in the row. */ - for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next) + // Handle all the frames in the row. + FOR_ALL_FRAMES(frp, frp->fr_child) { frame_add_statusline(frp); - } else { /* 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) - ; + } + } else { + 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); } } @@ -3165,8 +3171,8 @@ frame_new_width ( win_new_width(wp, width - wp->w_vsep_width); } else if (topfrp->fr_layout == FR_COL) { do { - /* All frames in this column get the same new width. */ - for (frp = topfrp->fr_child; frp != NULL; frp = frp->fr_next) { + // All frames in this column get the same new width. + FOR_ALL_FRAMES(frp, topfrp->fr_child) { frame_new_width(frp, width, leftfirst, wfw); if (frp->fr_width > width) { /* 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". * 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; @@ -3247,11 +3254,13 @@ static void frame_add_vsep(frame_T *frp) wp->w_vsep_width = 1; } } else if (frp->fr_layout == FR_COL) { - /* Handle all the frames in the column. */ - for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next) + // Handle all the frames in the column. + FOR_ALL_FRAMES(frp, frp->fr_child) { 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; while (frp->fr_next != NULL) 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) { /* get the minimal height from each frame in this row */ 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); if (n > m) m = n; @@ -3309,8 +3318,9 @@ static int frame_minheight(frame_T *topfrp, win_T *next_curwin) } else { /* Add up the minimal heights for all frames in this column. */ 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); + } } return m; @@ -3344,7 +3354,7 @@ frame_minwidth ( } else if (topfrp->fr_layout == FR_COL) { /* get the minimal width from each frame in this column */ 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); if (n > m) m = n; @@ -3352,8 +3362,9 @@ frame_minwidth ( } else { /* Add up the minimal widths for all frames in this row. */ 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); + } } return m; @@ -4830,11 +4841,12 @@ static void frame_comp_pos(frame_T *topfrp, int *row, int *col) } else { startrow = *row; startcol = *col; - for (frp = topfrp->fr_child; frp != NULL; frp = frp->fr_next) { - if (topfrp->fr_layout == FR_ROW) - *row = startrow; /* all frames are at the same row */ - else - *col = startcol; /* all frames are at the same col */ + FOR_ALL_FRAMES(frp, topfrp->fr_child) { + if (topfrp->fr_layout == FR_ROW) { + *row = startrow; // all frames are at the same row + } else { + *col = startcol; // all frames are at the same col + } frame_comp_pos(frp, row, col); } } @@ -4943,15 +4955,16 @@ static void frame_setheight(frame_T *curfrp, int height) for (run = 1; run <= 2; ++run) { room = 0; room_reserved = 0; - for (frp = curfrp->fr_parent->fr_child; frp != NULL; - frp = frp->fr_next) { + FOR_ALL_FRAMES(frp, curfrp->fr_parent->fr_child) { if (frp != curfrp && frp->fr_win != NULL - && frp->fr_win->w_p_wfh) + && frp->fr_win->w_p_wfh) { room_reserved += frp->fr_height; + } room += frp->fr_height; - if (frp != curfrp) + if (frp != curfrp) { room -= frame_minheight(frp, NULL); + } } if (curfrp->fr_width != Columns) { room_cmdline = 0; @@ -5124,15 +5137,16 @@ static void frame_setwidth(frame_T *curfrp, int width) for (run = 1; run <= 2; ++run) { room = 0; room_reserved = 0; - for (frp = curfrp->fr_parent->fr_child; frp != NULL; - frp = frp->fr_next) { + FOR_ALL_FRAMES(frp, curfrp->fr_parent->fr_child) { if (frp != curfrp && frp->fr_win != NULL - && frp->fr_win->w_p_wfw) + && frp->fr_win->w_p_wfw) { room_reserved += frp->fr_width; + } room += frp->fr_width; - if (frp != curfrp) + if (frp != curfrp) { room -= frame_minwidth(frp, NULL); + } } if (width <= room) @@ -5296,10 +5310,11 @@ void win_drag_status_line(win_T *dragwin, int offset) room -= p_ch; if (room < 0) room = 0; - /* sum up the room of frames below of the current one */ - for (fr = curfr->fr_next; fr != NULL; fr = fr->fr_next) + // sum up the room of frames below of the current one + FOR_ALL_FRAMES(fr, curfr->fr_next) { 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 */ @@ -5399,9 +5414,10 @@ void win_drag_vsep_line(win_T *dragwin, int offset) left = FALSE; /* sum up the room of frames right of the current one */ 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); - fr = curfr; /* put fr at window that grows */ + } + fr = curfr; // put fr at window that grows } assert(fr); @@ -5933,9 +5949,10 @@ static void last_status_rec(frame_T *fr, int statusline) redraw_all_later(SOME_VALID); } } else if (fr->fr_layout == FR_ROW) { - /* vertically split windows, set status line for each one */ - for (fp = fr->fr_child; fp != NULL; fp = fp->fr_next) + // vertically split windows, set status line for each one + FOR_ALL_FRAMES(fp, fr->fr_child) { last_status_rec(fp, statusline); + } } else { /* horizontally split window, set status line for last one */ 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 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 { if (topfrp->fr_height != height) { return false; } 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) { return false; } @@ -6571,14 +6589,15 @@ static bool frame_check_height(frame_T *topfrp, int height) /// /// @param topfrp top frame pointer /// @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 { if (topfrp->fr_width != width) { return false; } 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) { return false; } |