0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -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

@ -2739,6 +2739,8 @@ values({dict}) List values in {dict}
virtcol({expr}) Number screen column of cursor or mark virtcol({expr}) Number screen column of cursor or mark
visualmode([expr]) String last visual mode used visualmode([expr]) String last visual mode used
wildmenumode() Number whether 'wildmenu' mode is active wildmenumode() Number whether 'wildmenu' mode is active
win_execute({id}, {command} [, {silent}])
String execute {command} in window {id}
win_findbuf({bufnr}) List find windows containing {bufnr} win_findbuf({bufnr}) List find windows containing {bufnr}
win_getid([{win} [, {tab}]]) Number get window ID for {win} in {tab} win_getid([{win} [, {tab}]]) Number get window ID for {win} in {tab}
win_gotoid({expr}) Number go to window with ID {expr} win_gotoid({expr}) Number go to window with ID {expr}
@ -4012,7 +4014,10 @@ execute({command} [, {silent}]) *execute()*
To get a list of lines use |split()| on the result: > To get a list of lines use |split()| on the result: >
split(execute('args'), "\n") split(execute('args'), "\n")
< When used recursively the output of the recursive call is not < To execute a command in another window than the current one
use `win_execute()`.
When used recursively the output of the recursive call is not
included in the output of the higher level call. included in the output of the higher level call.
exepath({expr}) *exepath()* exepath({expr}) *exepath()*
@ -10310,6 +10315,12 @@ wildmenumode() *wildmenumode()*
< <
(Note, this needs the 'wildcharm' option set appropriately). (Note, this needs the 'wildcharm' option set appropriately).
win_execute({id}, {command} [, {silent}]) *win_execute()*
Like `execute()` but in the context of window {id}.
The window will temporarily be made the current window,
without triggering autocommands.
Example: >
call win_execute(winid, 'syntax enable')
win_findbuf({bufnr}) *win_findbuf()* win_findbuf({bufnr}) *win_findbuf()*
Returns a list with |window-ID|s for windows that contain Returns a list with |window-ID|s for windows that contain

View File

@ -70,6 +70,7 @@ By default the 'wrap' option is set, so that no text disappears. However, if
there is not enough space, some text may be invisible. there is not enough space, some text may be invisible.
TODO: TODO:
Example how to use syntax highlighting of a code snippet. Example how to use syntax highlighting of a code snippet.
@ -242,14 +243,6 @@ popup_getposition({id}) *popup_getposition()*
positioning mechanism applied. positioning mechanism applied.
If popup window {id} is not found an empty Dict is returned. If popup window {id} is not found an empty Dict is returned.
win_execute({id}, {command})
{not implemented yet}
Like `execute()` but in the context of window {id}.
The window will temporarily be made the current window,
without triggering autocommands.
Example: >
call win_execute(winid, 'syntax enable')
<
*:popupclear* *:popupc* *:popupclear* *:popupc*
:popupc[lear] Emergency solution to a misbehaving plugin: close all popup :popupc[lear] Emergency solution to a misbehaving plugin: close all popup
@ -274,6 +267,10 @@ better leave them alone.
The window does have a cursor position, but the cursor is not displayed. The window does have a cursor position, but the cursor is not displayed.
To execute a command in the context of the popup window and buffer use
`win_execute()`. Example: >
call win_execute(winid, 'syntax enable')
Options can be set on the window with `setwinvar()`, e.g.: > Options can be set on the window with `setwinvar()`, e.g.: >
call setwinvar(winid, '&wrap', 0) call setwinvar(winid, '&wrap', 0)
And options can be set on the buffer with `setbufvar()`, e.g.: > And options can be set on the buffer with `setbufvar()`, e.g.: >

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_virtcol(typval_T *argvars, typval_T *rettv);
static void f_visualmode(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_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_findbuf(typval_T *argvars, typval_T *rettv);
static void f_win_getid(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); static void f_win_gotoid(typval_T *argvars, typval_T *rettv);
@ -1045,6 +1046,7 @@ static struct fst
{"virtcol", 1, 1, f_virtcol}, {"virtcol", 1, 1, f_virtcol},
{"visualmode", 0, 1, f_visualmode}, {"visualmode", 0, 1, f_visualmode},
{"wildmenumode", 0, 0, f_wildmenumode}, {"wildmenumode", 0, 0, f_wildmenumode},
{"win_execute", 2, 3, f_win_execute},
{"win_findbuf", 1, 1, f_win_findbuf}, {"win_findbuf", 1, 1, f_win_findbuf},
{"win_getid", 0, 2, f_win_getid}, {"win_getid", 0, 2, f_win_getid},
{"win_gotoid", 1, 1, f_win_gotoid}, {"win_gotoid", 1, 1, f_win_gotoid},
@ -3519,7 +3521,7 @@ get_list_line(
* "execute()" function * "execute()" function
*/ */
static void 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; char_u *cmd = NULL;
list_T *list = NULL; list_T *list = NULL;
@ -3535,9 +3537,9 @@ f_execute(typval_T *argvars, typval_T *rettv)
rettv->vval.v_string = NULL; rettv->vval.v_string = NULL;
rettv->v_type = VAR_STRING; 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) if (list == NULL || list->lv_first == NULL)
/* empty list, no commands, empty output */ /* empty list, no commands, empty output */
return; return;
@ -3545,15 +3547,15 @@ f_execute(typval_T *argvars, typval_T *rettv)
} }
else else
{ {
cmd = tv_get_string_chk(&argvars[0]); cmd = tv_get_string_chk(&argvars[arg_off]);
if (cmd == NULL) if (cmd == NULL)
return; return;
} }
if (argvars[1].v_type != VAR_UNKNOWN) if (argvars[arg_off + 1].v_type != VAR_UNKNOWN)
{ {
char_u buf[NUMBUFLEN]; 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) if (s == NULL)
return; return;
@ -3620,6 +3622,15 @@ f_execute(typval_T *argvars, typval_T *rettv)
msg_col = save_msg_col; msg_col = save_msg_col;
} }
/*
* "execute()" function
*/
static void
f_execute(typval_T *argvars, typval_T *rettv)
{
execute_common(argvars, rettv, 0);
}
/* /*
* "exepath()" function * "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 * "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_ul = -1; // no undo
buf->b_p_swf = FALSE; // no swap file buf->b_p_swf = FALSE; // no swap file
buf->b_p_bl = FALSE; // unlisted buffer buf->b_p_bl = FALSE; // unlisted buffer
buf->b_locked = TRUE;
win_init_popup_win(wp, buf); win_init_popup_win(wp, buf);
@ -376,6 +377,7 @@ f_popup_show(typval_T *argvars, typval_T *rettv UNUSED)
static void static void
popup_free(win_T *wp) popup_free(win_T *wp)
{ {
wp->w_buffer->b_locked = FALSE;
if (wp->w_winrow + wp->w_height >= cmdline_row) if (wp->w_winrow + wp->w_height >= cmdline_row)
clear_cmdline = TRUE; clear_cmdline = TRUE;
win_free_popup(wp); win_free_popup(wp);

View File

@ -78,3 +78,27 @@ func Test_execute_not_silent()
endfor endfor
call assert_equal('xyz ', text2) call assert_equal('xyz ', text2)
endfunc 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[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1418,
/**/ /**/
1417, 1417,
/**/ /**/