Patch 8.1.1418
Problem: Win_execute() is not implemented yet.
Solution: Implement it.
Files: src/evalfunc.c, src/popupwin.c, src/testdir/test_execute_func.vim,
runtime/doc/popup.txt, runtime/doc/eval.txt
*** ../vim-8.1.1417/src/evalfunc.c 2019-05-29 20:26:32.525530253 +0200
--- src/evalfunc.c 2019-05-29 21:22:16.884099074 +0200
***************
*** 492,497 ****
--- 492,498 ----
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,1050 ****
--- 1046,1052 ----
{"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,3525 ****
* "execute()" function
*/
static void
! f_execute(typval_T *argvars, typval_T *rettv)
{
char_u *cmd = NULL;
list_T *list = NULL;
--- 3521,3527 ----
* "execute()" function
*/
static void
! execute_common(typval_T *argvars, typval_T *rettv, int arg_off)
{
char_u *cmd = NULL;
list_T *list = NULL;
***************
*** 3535,3543 ****
rettv->vval.v_string = NULL;
rettv->v_type = VAR_STRING;
! if (argvars[0].v_type == VAR_LIST)
{
! list = argvars[0].vval.v_list;
if (list == NULL || list->lv_first == NULL)
/* empty list, no commands, empty output */
return;
--- 3537,3545 ----
rettv->vval.v_string = NULL;
rettv->v_type = VAR_STRING;
! if (argvars[arg_off].v_type == VAR_LIST)
{
! list = argvars[arg_off].vval.v_list;
if (list == NULL || list->lv_first == NULL)
/* empty list, no commands, empty output */
return;
***************
*** 3545,3559 ****
}
else
{
! cmd = tv_get_string_chk(&argvars[0]);
if (cmd == NULL)
return;
}
! if (argvars[1].v_type != VAR_UNKNOWN)
{
char_u buf[NUMBUFLEN];
! char_u *s = tv_get_string_buf_chk(&argvars[1], buf);
if (s == NULL)
return;
--- 3547,3561 ----
}
else
{
! cmd = tv_get_string_chk(&argvars[arg_off]);
if (cmd == NULL)
return;
}
! if (argvars[arg_off + 1].v_type != VAR_UNKNOWN)
{
char_u buf[NUMBUFLEN];
! char_u *s = tv_get_string_buf_chk(&argvars[arg_off + 1], buf);
if (s == NULL)
return;
***************
*** 3621,3626 ****
--- 3623,3637 ----
}
/*
+ * "execute()" function
+ */
+ static void
+ f_execute(typval_T *argvars, typval_T *rettv)
+ {
+ execute_common(argvars, rettv, 0);
+ }
+
+ /*
* "exepath()" function
*/
static void
***************
*** 6095,6100 ****
--- 6106,6135 ----
}
}
}
+
+ /*
+ * "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
*** ../vim-8.1.1417/src/popupwin.c 2019-05-29 20:26:32.525530253 +0200
--- src/popupwin.c 2019-05-29 21:24:53.287215209 +0200
***************
*** 238,243 ****
--- 238,244 ----
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,381 ****
--- 377,383 ----
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);
*** ../vim-8.1.1417/src/testdir/test_execute_func.vim 2018-12-08
13:57:38.553692769 +0100
--- src/testdir/test_execute_func.vim 2019-05-29 21:41:04.481900749 +0200
***************
*** 78,80 ****
--- 78,104 ----
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
*** ../vim-8.1.1417/runtime/doc/popup.txt 2019-05-29 20:26:32.525530253
+0200
--- runtime/doc/popup.txt 2019-05-29 20:49:40.058507387 +0200
***************
*** 70,75 ****
--- 70,76 ----
there is not enough space, some text may be invisible.
+
TODO:
Example how to use syntax highlighting of a code snippet.
***************
*** 242,255 ****
positioning mechanism applied.
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*
:popupc[lear] Emergency solution to a misbehaving plugin: close all popup
--- 243,248 ----
***************
*** 274,279 ****
--- 267,276 ----
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.: >
call setwinvar(winid, '&wrap', 0)
And options can be set on the buffer with `setbufvar()`, e.g.: >
*** ../vim-8.1.1417/runtime/doc/eval.txt 2019-05-19 18:41:23.262148495
+0200
--- runtime/doc/eval.txt 2019-05-29 20:52:47.933510908 +0200
***************
*** 2738,2743 ****
--- 2739,2746 ----
virtcol({expr}) Number screen column of cursor or mark
visualmode([expr]) String last visual mode used
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_getid([{win} [, {tab}]]) Number get window ID for {win} in {tab}
win_gotoid({expr}) Number go to window with ID {expr}
***************
*** 4011,4017 ****
To get a list of lines use |split()| on the result: >
split(execute('args'), "\n")
! < When used recursively the output of the recursive call is not
included in the output of the higher level call.
exepath({expr}) *exepath()*
--- 4014,4023 ----
To get a list of lines use |split()| on the result: >
split(execute('args'), "\n")
! < 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.
exepath({expr}) *exepath()*
***************
*** 10306,10311 ****
--- 10315,10326 ----
<
(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()*
Returns a list with |window-ID|s for windows that contain
*** ../vim-8.1.1417/src/version.c 2019-05-29 20:36:51.502509469 +0200
--- src/version.c 2019-05-29 20:49:08.242676060 +0200
***************
*** 769,770 ****
--- 769,772 ----
{ /* Add new patch number below this line */
+ /**/
+ 1418,
/**/
--
hundred-and-one symptoms of being an internet addict:
44. Your friends no longer send you e-mail...they just log on to your IRC
channel.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/201905291944.x4TJiwWE005471%40masaka.moolenaar.net.
For more options, visit https://groups.google.com/d/optout.