mirror of
https://github.com/neovim/neovim.git
synced 2025-10-17 15:21:47 +00:00
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:
@@ -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 output, not necessarily the whole line. Only some
|
||||
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
|
||||
not.
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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.
|
||||
|
@@ -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)
|
||||
|
@@ -656,49 +656,52 @@ 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;
|
||||
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)
|
||||
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
|
||||
} 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;
|
||||
}
|
||||
if (!message_filtered(name)) {
|
||||
if (!did_title) {
|
||||
/* Highlight title */
|
||||
MSG_PUTS_TITLE(_("\nmark line col file/text"));
|
||||
did_title = TRUE;
|
||||
// Highlight title
|
||||
msg_puts_title(_("\nmark line col file/text"));
|
||||
did_title = true;
|
||||
}
|
||||
msg_putchar('\n');
|
||||
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);
|
||||
if (name == NULL && current) {
|
||||
name = mark_line(p, 15);
|
||||
mustfree = TRUE;
|
||||
}
|
||||
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) {
|
||||
|
@@ -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
|
||||
|
@@ -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) {
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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,
|
||||
|
@@ -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)
|
||||
|
@@ -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
|
||||
|
@@ -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!'
|
||||
|
@@ -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
|
||||
|
@@ -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,12 +1247,14 @@ 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)
|
||||
frp = wp->w_frame;
|
||||
@@ -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,9 +3318,10 @@ 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,9 +3362,10 @@ 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,16 +4955,17 @@ 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;
|
||||
} else {
|
||||
@@ -5124,16 +5137,17 @@ 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)
|
||||
break;
|
||||
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user