0
0
mirror of https://github.com/vim/vim.git synced 2025-10-13 06:54:15 -04:00

patch 8.1.1418: win_execute() is not implemented yet

Problem:    Win_execute() is not implemented yet.
Solution:   Implement it.
This commit is contained in:
Bram Moolenaar
2019-05-29 21:44:40 +02:00
parent 1bbebab525
commit 868b7b6712
6 changed files with 86 additions and 15 deletions

View File

@@ -492,6 +492,7 @@ static void f_values(typval_T *argvars, typval_T *rettv);
static void f_virtcol(typval_T *argvars, typval_T *rettv);
static void f_visualmode(typval_T *argvars, typval_T *rettv);
static void f_wildmenumode(typval_T *argvars, typval_T *rettv);
static void f_win_execute(typval_T *argvars, typval_T *rettv);
static void f_win_findbuf(typval_T *argvars, typval_T *rettv);
static void f_win_getid(typval_T *argvars, typval_T *rettv);
static void f_win_gotoid(typval_T *argvars, typval_T *rettv);
@@ -1045,6 +1046,7 @@ static struct fst
{"virtcol", 1, 1, f_virtcol},
{"visualmode", 0, 1, f_visualmode},
{"wildmenumode", 0, 0, f_wildmenumode},
{"win_execute", 2, 3, f_win_execute},
{"win_findbuf", 1, 1, f_win_findbuf},
{"win_getid", 0, 2, f_win_getid},
{"win_gotoid", 1, 1, f_win_gotoid},
@@ -3519,7 +3521,7 @@ get_list_line(
* "execute()" function
*/
static void
f_execute(typval_T *argvars, typval_T *rettv)
execute_common(typval_T *argvars, typval_T *rettv, int arg_off)
{
char_u *cmd = NULL;
list_T *list = NULL;
@@ -3535,9 +3537,9 @@ f_execute(typval_T *argvars, typval_T *rettv)
rettv->vval.v_string = NULL;
rettv->v_type = VAR_STRING;
if (argvars[0].v_type == VAR_LIST)
if (argvars[arg_off].v_type == VAR_LIST)
{
list = argvars[0].vval.v_list;
list = argvars[arg_off].vval.v_list;
if (list == NULL || list->lv_first == NULL)
/* empty list, no commands, empty output */
return;
@@ -3545,15 +3547,15 @@ f_execute(typval_T *argvars, typval_T *rettv)
}
else
{
cmd = tv_get_string_chk(&argvars[0]);
cmd = tv_get_string_chk(&argvars[arg_off]);
if (cmd == NULL)
return;
}
if (argvars[1].v_type != VAR_UNKNOWN)
if (argvars[arg_off + 1].v_type != VAR_UNKNOWN)
{
char_u buf[NUMBUFLEN];
char_u *s = tv_get_string_buf_chk(&argvars[1], buf);
char_u *s = tv_get_string_buf_chk(&argvars[arg_off + 1], buf);
if (s == NULL)
return;
@@ -3620,6 +3622,15 @@ f_execute(typval_T *argvars, typval_T *rettv)
msg_col = save_msg_col;
}
/*
* "execute()" function
*/
static void
f_execute(typval_T *argvars, typval_T *rettv)
{
execute_common(argvars, rettv, 0);
}
/*
* "exepath()" function
*/
@@ -6096,6 +6107,30 @@ f_getwininfo(typval_T *argvars, typval_T *rettv)
}
}
/*
* "win_execute()" function
*/
static void
f_win_execute(typval_T *argvars, typval_T *rettv)
{
int id = (int)tv_get_number(argvars);
win_T *wp = win_id2wp(id);
win_T *save_curwin = curwin;
if (wp != NULL)
{
curwin = wp;
curbuf = curwin->w_buffer;
check_cursor();
execute_common(argvars, rettv, 1);
if (win_valid(save_curwin))
{
curwin = save_curwin;
curbuf = curwin->w_buffer;
}
}
}
/*
* "win_findbuf()" function
*/

View File

@@ -238,6 +238,7 @@ f_popup_create(typval_T *argvars, typval_T *rettv)
buf->b_p_ul = -1; // no undo
buf->b_p_swf = FALSE; // no swap file
buf->b_p_bl = FALSE; // unlisted buffer
buf->b_locked = TRUE;
win_init_popup_win(wp, buf);
@@ -376,6 +377,7 @@ f_popup_show(typval_T *argvars, typval_T *rettv UNUSED)
static void
popup_free(win_T *wp)
{
wp->w_buffer->b_locked = FALSE;
if (wp->w_winrow + wp->w_height >= cmdline_row)
clear_cmdline = TRUE;
win_free_popup(wp);

View File

@@ -78,3 +78,27 @@ func Test_execute_not_silent()
endfor
call assert_equal('xyz ', text2)
endfunc
func Test_win_execute()
let thiswin = win_getid()
new
let otherwin = win_getid()
call setline(1, 'the new window')
call win_gotoid(thiswin)
let line = win_execute(otherwin, 'echo getline(1)')
call assert_match('the new window', line)
if has('textprop')
let popupwin = popup_create('the popup win', {'line': 2, 'col': 3})
redraw
let line = win_execute(popupwin, 'echo getline(1)')
call assert_match('the popup win', line)
call assert_fails('call win_execute(popupwin, "bwipe!")', 'E937:')
call popup_close(popupwin)
endif
call win_gotoid(otherwin)
bwipe!
endfunc

View File

@@ -767,6 +767,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1418,
/**/
1417,
/**/