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.

Raspunde prin e-mail lui