Patch 8.1.2192
Problem:    Cannot easily fill the info popup asynchronously.
Solution:   Add the "popuphidden" value to 'completeopt'. (closes #4924)
Files:      src/popupmenu.c, src/proto/popupmenu.pro, src/popupwin.c,
            src/proto/popupwin.pro, src/vim.h, runtime/doc/options.txt,
            runtime/doc/insert.txt, src/ex_cmds.c, src/proto/ex_cmds.pro,
            src/optionstr.c, src/testdir/test_popupwin.vim,
            src/testdir/dumps/Test_popupwin_infopopup_hidden_1.dump,
            src/testdir/dumps/Test_popupwin_infopopup_hidden_2.dump,
            src/testdir/dumps/Test_popupwin_infopopup_hidden_3.dump


*** ../vim-8.1.2191/src/popupmenu.c     2019-10-06 22:00:08.297244105 +0200
--- src/popupmenu.c     2019-10-20 17:08:40.597992919 +0200
***************
*** 622,654 ****
  }
  
  #if defined(FEAT_TEXT_PROP) && defined(FEAT_QUICKFIX)
!     static void
! pum_position_info_popup(void)
  {
      int col = pum_col + pum_width + 1;
      int row = pum_row;
      int botpos = POPPOS_BOTLEFT;
  
!     curwin->w_popup_pos = POPPOS_TOPLEFT;
      if (Columns - col < 20 && Columns - col < pum_col)
      {
        col = pum_col - 1;
!       curwin->w_popup_pos = POPPOS_TOPRIGHT;
        botpos = POPPOS_BOTRIGHT;
!       curwin->w_maxwidth = pum_col - 1;
      }
      else
!       curwin->w_maxwidth = Columns - col + 1;
!     curwin->w_maxwidth -= popup_extra_width(curwin);
  
!     row -= popup_top_extra(curwin);
!     if (curwin->w_popup_flags & POPF_INFO_MENU)
      {
        if (pum_row < pum_win_row)
        {
            // menu above cursor line, align with bottom
            row += pum_height;
!           curwin->w_popup_pos = botpos;
        }
        else
            // menu below cursor line, align with top
--- 622,657 ----
  }
  
  #if defined(FEAT_TEXT_PROP) && defined(FEAT_QUICKFIX)
! /*
!  * Position the info popup relative to the popup menu item.
!  */
!     void
! pum_position_info_popup(win_T *wp)
  {
      int col = pum_col + pum_width + 1;
      int row = pum_row;
      int botpos = POPPOS_BOTLEFT;
  
!     wp->w_popup_pos = POPPOS_TOPLEFT;
      if (Columns - col < 20 && Columns - col < pum_col)
      {
        col = pum_col - 1;
!       wp->w_popup_pos = POPPOS_TOPRIGHT;
        botpos = POPPOS_BOTRIGHT;
!       wp->w_maxwidth = pum_col - 1;
      }
      else
!       wp->w_maxwidth = Columns - col + 1;
!     wp->w_maxwidth -= popup_extra_width(wp);
  
!     row -= popup_top_extra(wp);
!     if (wp->w_popup_flags & POPF_INFO_MENU)
      {
        if (pum_row < pum_win_row)
        {
            // menu above cursor line, align with bottom
            row += pum_height;
!           wp->w_popup_pos = botpos;
        }
        else
            // menu below cursor line, align with top
***************
*** 658,664 ****
        // align with the selected item
        row += pum_selected - pum_first + 1;
  
!     popup_set_wantpos_rowcol(curwin, row, col);
  }
  #endif
  
--- 661,667 ----
        // align with the selected item
        row += pum_selected - pum_first + 1;
  
!     popup_set_wantpos_rowcol(wp, row, col);
  }
  #endif
  
***************
*** 756,770 ****
            tabpage_T   *curtab_save = curtab;
            int         res = OK;
  # ifdef FEAT_TEXT_PROP
!           int         use_popup = strstr((char *)p_cot, "popup") != NULL;
  # else
! #  define use_popup 0
  # endif
  # ifdef FEAT_TEXT_PROP
            has_info = TRUE;
  # endif
!           // Open a preview window.  3 lines by default.  Prefer
!           // 'previewheight' if set and smaller.
            g_do_tagpreview = 3;
            if (p_pvh > 0 && p_pvh < g_do_tagpreview)
                g_do_tagpreview = p_pvh;
--- 759,779 ----
            tabpage_T   *curtab_save = curtab;
            int         res = OK;
  # ifdef FEAT_TEXT_PROP
!           use_popup_T use_popup;
  # else
! #  define use_popup POPUP_NONE
  # endif
  # ifdef FEAT_TEXT_PROP
            has_info = TRUE;
+           if (strstr((char *)p_cot, "popuphidden") != NULL)
+               use_popup = USEPOPUP_HIDDEN;
+           else if (strstr((char *)p_cot, "popup") != NULL)
+               use_popup = USEPOPUP_NORMAL;
+           else
+               use_popup = USEPOPUP_NONE;
  # endif
!           // Open a preview window and set "curwin" to it.
!           // 3 lines by default, prefer 'previewheight' if set and smaller.
            g_do_tagpreview = 3;
            if (p_pvh > 0 && p_pvh < g_do_tagpreview)
                g_do_tagpreview = p_pvh;
***************
*** 838,844 ****
  
                    /* Increase the height of the preview window to show the
                     * text, but no more than 'previewheight' lines. */
!                   if (repeat == 0 && !use_popup)
                    {
                        if (lnum > p_pvh)
                            lnum = p_pvh;
--- 847,853 ----
  
                    /* Increase the height of the preview window to show the
                     * text, but no more than 'previewheight' lines. */
!                   if (repeat == 0 && use_popup == USEPOPUP_NONE)
                    {
                        if (lnum > p_pvh)
                            lnum = p_pvh;
***************
*** 863,871 ****
                    curwin->w_cursor.lnum = curwin->w_topline;
                    curwin->w_cursor.col = 0;
  # ifdef FEAT_TEXT_PROP
!                   if (use_popup)
                    {
!                       pum_position_info_popup();
                        if (win_valid(curwin_save))
                            redraw_win_later(curwin_save, SOME_VALID);
                    }
--- 872,880 ----
                    curwin->w_cursor.lnum = curwin->w_topline;
                    curwin->w_cursor.col = 0;
  # ifdef FEAT_TEXT_PROP
!                   if (use_popup != USEPOPUP_NONE)
                    {
!                       pum_position_info_popup(curwin);
                        if (win_valid(curwin_save))
                            redraw_win_later(curwin_save, SOME_VALID);
                    }
***************
*** 907,915 ****
--- 916,931 ----
  
                        if (!resized && win_valid(curwin_save))
                        {
+ # ifdef FEAT_TEXT_PROP
+                           win_T *wp = curwin;
+ # endif
                            ++no_u_sync;
                            win_enter(curwin_save, TRUE);
                            --no_u_sync;
+ # ifdef FEAT_TEXT_PROP
+                           if (use_popup == USEPOPUP_HIDDEN && win_valid(wp))
+                               popup_hide(wp);
+ # endif
                        }
  
                        /* May need to update the screen again when there are
*** ../vim-8.1.2191/src/proto/popupmenu.pro     2019-09-27 14:19:05.600200451 
+0200
--- src/proto/popupmenu.pro     2019-10-20 14:15:23.993650863 +0200
***************
*** 3,8 ****
--- 3,9 ----
  void pum_call_update_screen(void);
  int pum_under_menu(int row, int col);
  void pum_redraw(void);
+ void pum_position_info_popup(win_T *wp);
  void pum_undisplay(void);
  void pum_clear(void);
  int pum_visible(void);
*** ../vim-8.1.2191/src/popupwin.c      2019-10-16 22:16:41.943699818 +0200
--- src/popupwin.c      2019-10-20 14:50:10.321609477 +0200
***************
*** 2225,2231 ****
        popup_close_and_callback(wp, &argvars[1]);
  }
  
!     static void
  popup_hide(win_T *wp)
  {
      if ((wp->w_popup_flags & POPF_HIDDEN) == 0)
--- 2225,2231 ----
        popup_close_and_callback(wp, &argvars[1]);
  }
  
!     void
  popup_hide(win_T *wp)
  {
      if ((wp->w_popup_flags & POPF_HIDDEN) == 0)
***************
*** 2272,2278 ****
--- 2272,2282 ----
      win_T     *wp = find_popup_win(id);
  
      if (wp != NULL)
+     {
        popup_show(wp);
+       if (wp->w_popup_flags & POPF_INFO)
+           pum_position_info_popup(wp);
+     }
  }
  
  /*
*** ../vim-8.1.2191/src/proto/popupwin.pro      2019-08-25 22:24:58.871357010 
+0200
--- src/proto/popupwin.pro      2019-10-20 14:50:18.529577192 +0200
***************
*** 26,31 ****
--- 26,32 ----
  void f_popup_menu(typval_T *argvars, typval_T *rettv);
  void f_popup_notification(typval_T *argvars, typval_T *rettv);
  void f_popup_close(typval_T *argvars, typval_T *rettv);
+ void popup_hide(win_T *wp);
  void f_popup_hide(typval_T *argvars, typval_T *rettv);
  void popup_show(win_T *wp);
  void f_popup_show(typval_T *argvars, typval_T *rettv);
*** ../vim-8.1.2191/src/vim.h   2019-10-19 22:50:17.523177438 +0200
--- src/vim.h   2019-10-20 14:23:26.159457701 +0200
***************
*** 2112,2117 ****
--- 2112,2124 ----
      FLUSH_INPUT               // flush typebuf and inchar() input
  } flush_buffers_T;
  
+ // Argument for prepare_tagpreview()
+ typedef enum {
+     USEPOPUP_NONE,
+     USEPOPUP_NORMAL,  // use info popup
+     USEPOPUP_HIDDEN   // use info popup initially hidden
+ } use_popup_T;
+ 
  #include "ex_cmds.h"      // Ex command defines
  #include "spell.h"        // spell checking stuff
  
*** ../vim-8.1.2191/runtime/doc/options.txt     2019-10-19 17:01:23.464526564 
+0200
--- runtime/doc/options.txt     2019-10-20 18:04:30.570998830 +0200
***************
*** 1917,1923 ****
                    completion in a popup window.  Only works in combination
                    with "menu" or "menuone".  Overrides "preview".
                    See |'completepopup'| for specifying properties.
!                   {only works when compiled with the +textprop feature}
  
           noinsert Do not insert any text for a match until the user selects
                    a match from the menu. Only works in combination with
--- 1917,1930 ----
                    completion in a popup window.  Only works in combination
                    with "menu" or "menuone".  Overrides "preview".
                    See |'completepopup'| for specifying properties.
!                   {only works when compiled with the |+textprop| feature}
! 
!          popuphidden
!                   Just like "popup" but initially hide the popup.  Use a
!                   |CompleteChanged| autocommand to fetch the info and call
!                   |popup_show()| once the popup has been filled.
!                   See the example at |complete-popuphidden|.
!                   {only works when compiled with the |+textprop| feature}
  
           noinsert Do not insert any text for a match until the user selects
                    a match from the menu. Only works in combination with
***************
*** 1934,1940 ****
                        {not available when compiled without the |+textprop|
                        or |+quickfix| feature}
        When 'completeopt' contains "popup" then this option is used for the
!       properties of the info popup.  See |complete-popup|.
  
  
                                                *'concealcursor'* *'cocu'*
--- 1941,1949 ----
                        {not available when compiled without the |+textprop|
                        or |+quickfix| feature}
        When 'completeopt' contains "popup" then this option is used for the
!       properties of the info popup when it is created.  You can also use
!       |popup_findinfo()| and then set properties for an existing info popup
!       with |popup_setoptions()|.  See |complete-popup|.
  
  
                                                *'concealcursor'* *'cocu'*
*** ../vim-8.1.2191/runtime/doc/insert.txt      2019-08-21 17:29:08.034793106 
+0200
--- runtime/doc/insert.txt      2019-10-20 18:05:46.706615914 +0200
***************
*** 1121,1141 ****
  
                                                *complete-popup*
  When "popup" is in 'completeopt' a popup window is used to display the "info".
! Then the 'completepopup' option specifies the properties of the popup.  The
! option is a comma separated list of values:
        height          maximum height of the popup
        width           maximum width of the popup
!       highlight       highlight group of the popup (default is Pmenu)
        align           "item" (default) or "menu"
        border          "on" (default) or "off"
  Example: >
        :set completepopup=height:10,width:60,highlight:InfoPopup
  
! When the "align" value is "item then the popup is positioned close to the
  selected item.  Changing the selection will also move the popup.  When "align"
  is "menu" then the popup is aligned with the top of the menu if the menu is
  below the text, and the bottom of the menu otherwise.
  
  The "kind" item uses a single letter to indicate the kind of completion.  This
  may be used to show the completion differently (different color or icon).
  Currently these types can be used:
--- 1119,1164 ----
  
                                                *complete-popup*
  When "popup" is in 'completeopt' a popup window is used to display the "info".
! Then the 'completepopup' option specifies the properties of the popup.  This
! is used when the info popup is created.  The option is a comma separated list
! of values:
        height          maximum height of the popup
        width           maximum width of the popup
!       highlight       highlight group of the popup (default is PmenuSel)
        align           "item" (default) or "menu"
        border          "on" (default) or "off"
  Example: >
        :set completepopup=height:10,width:60,highlight:InfoPopup
  
! When the "align" value is "item" then the popup is positioned close to the
  selected item.  Changing the selection will also move the popup.  When "align"
  is "menu" then the popup is aligned with the top of the menu if the menu is
  below the text, and the bottom of the menu otherwise.
  
+ After the info popup is created it can be found with |popup_findinfo()| and
+ properties can be changed with |popup_setoptions()|.
+ 
+                                               *complete-popuphidden*
+ If the information for the popup is obtained asynchronously, use "popuphidden"
+ in 'completeopt'.  The info popup will then be initally hidden and
+ |popup_show()| must be called once it has been filled with the info.  This can
+ be done with a |CompleteChanged| autocommand, something like this: >
+       set completeopt+=popuphidden
+       au CompleteChanged * call UpdateCompleteInfo()
+       func UpdateCompleteInfo()
+         " Cancel any pending info fetch
+         let item = v:event.completed_item
+         " Start fetching info for the item then call ShowCompleteInfo(info)
+       endfunc
+       func ShowCompleteInfo(info)
+         let id = popup_findinfo()
+         if id
+           call popup_settext(id, 'async info: ' .. a:info)
+           call popup_show(id)
+         endif
+       endfunc
+ 
+ <                                             *complete-item-kind*
  The "kind" item uses a single letter to indicate the kind of completion.  This
  may be used to show the completion differently (different color or icon).
  Currently these types can be used:
*** ../vim-8.1.2191/src/ex_cmds.c       2019-10-09 22:52:48.996043767 +0200
--- src/ex_cmds.c       2019-10-20 14:37:51.708333145 +0200
***************
*** 4919,4931 ****
  #if defined(FEAT_QUICKFIX) || defined(PROTO)
  /*
   * Set up for a tagpreview.
   * Return TRUE when it was created.
   */
      int
  prepare_tagpreview(
      int               undo_sync,          // sync undo when leaving the window
      int               use_previewpopup,   // use popup if 'previewpopup' set
!     int               use_popup)          // use other popup window
  {
      win_T     *wp;
  
--- 4919,4932 ----
  #if defined(FEAT_QUICKFIX) || defined(PROTO)
  /*
   * Set up for a tagpreview.
+  * Makes the preview window the current window.
   * Return TRUE when it was created.
   */
      int
  prepare_tagpreview(
      int               undo_sync,          // sync undo when leaving the window
      int               use_previewpopup,   // use popup if 'previewpopup' set
!     use_popup_T       use_popup)          // use other popup window
  {
      win_T     *wp;
  
***************
*** 4945,4955 ****
            if (wp != NULL)
                popup_set_wantpos_cursor(wp, wp->w_minwidth);
        }
!       else if (use_popup)
        {
            wp = popup_find_info_window();
            if (wp != NULL)
!               popup_show(wp);
        }
        else
  # endif
--- 4946,4961 ----
            if (wp != NULL)
                popup_set_wantpos_cursor(wp, wp->w_minwidth);
        }
!       else if (use_popup != USEPOPUP_NONE)
        {
            wp = popup_find_info_window();
            if (wp != NULL)
!           {
!               if (use_popup == USEPOPUP_NORMAL)
!                   popup_show(wp);
!               else
!                   popup_hide(wp);
!           }
        }
        else
  # endif
***************
*** 4966,4973 ****
             * There is no preview window open yet.  Create one.
             */
  # ifdef FEAT_TEXT_PROP
!           if ((use_previewpopup && *p_pvp != NUL) || use_popup)
!               return popup_create_preview_window(use_popup);
  # endif
            if (win_split(g_do_tagpreview > 0 ? g_do_tagpreview : 0, 0) == FAIL)
                return FALSE;
--- 4972,4980 ----
             * There is no preview window open yet.  Create one.
             */
  # ifdef FEAT_TEXT_PROP
!           if ((use_previewpopup && *p_pvp != NUL)
!                                                || use_popup != USEPOPUP_NONE)
!               return popup_create_preview_window(use_popup != USEPOPUP_NONE);
  # endif
            if (win_split(g_do_tagpreview > 0 ? g_do_tagpreview : 0, 0) == FAIL)
                return FALSE;
*** ../vim-8.1.2191/src/proto/ex_cmds.pro       2019-10-09 22:52:49.000043746 
+0200
--- src/proto/ex_cmds.pro       2019-10-20 14:49:21.889799414 +0200
***************
*** 35,41 ****
  char_u *get_old_sub(void);
  void set_old_sub(char_u *val);
  void free_old_sub(void);
! int prepare_tagpreview(int undo_sync, int use_previewpopup, int use_popup);
  void ex_help(exarg_T *eap);
  void ex_helpclose(exarg_T *eap);
  char_u *check_help_lang(char_u *arg);
--- 35,41 ----
  char_u *get_old_sub(void);
  void set_old_sub(char_u *val);
  void free_old_sub(void);
! int prepare_tagpreview(int undo_sync, int use_previewpopup, use_popup_T 
use_popup);
  void ex_help(exarg_T *eap);
  void ex_helpclose(exarg_T *eap);
  char_u *check_help_lang(char_u *arg);
*** ../vim-8.1.2191/src/optionstr.c     2019-10-17 22:58:59.066497012 +0200
--- src/optionstr.c     2019-10-20 14:54:52.664486507 +0200
***************
*** 76,82 ****
                                NULL};
  static char *(p_fcl_values[]) = {"all", NULL};
  #endif
! static char *(p_cot_values[]) = {"menu", "menuone", "longest", "preview", 
"popup", "noinsert", "noselect", NULL};
  #ifdef BACKSLASH_IN_FILENAME
  static char *(p_csl_values[]) = {"slash", "backslash", NULL};
  #endif
--- 76,82 ----
                                NULL};
  static char *(p_fcl_values[]) = {"all", NULL};
  #endif
! static char *(p_cot_values[]) = {"menu", "menuone", "longest", "preview", 
"popup", "popuphidden", "noinsert", "noselect", NULL};
  #ifdef BACKSLASH_IN_FILENAME
  static char *(p_csl_values[]) = {"slash", "backslash", NULL};
  #endif
*** ../vim-8.1.2191/src/testdir/test_popupwin.vim       2019-10-16 
22:16:41.947699813 +0200
--- src/testdir/test_popupwin.vim       2019-10-20 17:52:53.842737893 +0200
***************
*** 2498,2503 ****
--- 2498,2538 ----
        let id = popup_findinfo()
        eval id->popup_setoptions(#{highlight: 'InfoPopup'})
        endfunc
+ 
+       func InfoHidden()
+       set completepopup=height:4,border:off,align:menu
+       set completeopt-=popup completeopt+=popuphidden
+       au CompleteChanged * call HandleChange()
+       endfunc
+ 
+       let s:counter = 0
+       func HandleChange()
+       let s:counter += 1
+       let selected = complete_info(['selected']).selected
+       if selected <= 0
+         " First time: do nothing, info remains hidden
+         return
+       endif
+       if selected == 1
+         " Second time: show info right away
+         let id = popup_findinfo()
+         if id
+           call popup_settext(id, 'immediate info ' .. s:counter)
+           call popup_show(id)
+         endif
+       else
+         " Third time: show info after a short delay
+         call timer_start(100, 'ShowInfo')
+       endif
+       endfunc
+ 
+       func ShowInfo(...)
+       let id = popup_findinfo()
+       if id
+         call popup_settext(id, 'async info ' .. s:counter)
+         call popup_show(id)
+       endif
+       endfunc
    END
    return lines
  endfunc
***************
*** 2580,2585 ****
--- 2615,2644 ----
    call delete('XtestInfoPopupNb')
  endfunc
  
+ func Test_popupmenu_info_hidden()
+   CheckScreendump
+ 
+   let lines = Get_popupmenu_lines()
+   call add(lines, 'call InfoHidden()')
+   call writefile(lines, 'XtestInfoPopupHidden')
+ 
+   let buf = RunVimInTerminal('-S XtestInfoPopupHidden', #{rows: 14})
+   call term_wait(buf, 50)
+ 
+   call term_sendkeys(buf, "A\<C-X>\<C-U>")
+   call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_1', {})
+ 
+   call term_sendkeys(buf, "\<C-N>")
+   call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_2', {})
+ 
+   call term_sendkeys(buf, "\<C-N>")
+   call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_3', {})
+ 
+   call term_sendkeys(buf, "\<Esc>")
+   call StopVimInTerminal(buf)
+   call delete('XtestInfoPopupHidden')
+ endfunc
+ 
  func Test_popupwin_recycle_bnr()
    let bufnr = popup_notification('nothing wrong', {})->winbufnr()
    call popup_clear()
*** ../vim-8.1.2191/src/testdir/dumps/Test_popupwin_infopopup_hidden_1.dump     
2019-10-20 18:14:53.752037855 +0200
--- src/testdir/dumps/Test_popupwin_infopopup_hidden_1.dump     2019-10-20 
17:53:02.546702697 +0200
***************
*** 0 ****
--- 1,14 ----
+ |t+0&#ffffff0|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| |t|a|w|o|r|d> @43
+ |~+0#4040ff13&| @23| +0#0000001#e0e0e08|w|r|d| @4|W| |e|x|t|r|a| |t|e|x|t| | 
+0#4040ff13#ffffff0@27
+ |~| @23| +0#0000001#ffd7ff255|a|n|o|t|w|r|d| |W| |e|x|t|r|a| |t|e|x|t| | 
+0#4040ff13#ffffff0@27
+ |~| @23| +0#0000001#ffd7ff255|n|o|a|w|r|d| @1|W| |e|x|t|r|a| |t|e|x|t| | 
+0#4040ff13#ffffff0@27
+ |~| @23| +0#0000001#ffd7ff255|t|h|a|t|w|r|d| |W| |e|x|t|r|a| |t|e|x|t| | 
+0#4040ff13#ffffff0@27
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |-+2#0000000&@1| |U|s|e|r| |d|e|f|i|n|e|d| |c|o|m|p|l|e|t|i|o|n| 
|(|^|U|^|N|^|P|)| |m+0#00e0003&|a|t|c|h| |1| |o|f| |4| +0#0000000&@26
*** ../vim-8.1.2191/src/testdir/dumps/Test_popupwin_infopopup_hidden_2.dump     
2019-10-20 18:14:53.756037834 +0200
--- src/testdir/dumps/Test_popupwin_infopopup_hidden_2.dump     2019-10-20 
17:53:03.606698411 +0200
***************
*** 0 ****
--- 1,14 ----
+ |t+0&#ffffff0|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| 
|t|a|n|o|t|h|e|r|w|o|r|d> @37
+ |~+0#4040ff13&| @23| +0#0000001#ffd7ff255|w|r|d| @4|W| |e|x|t|r|a| |t|e|x|t| 
| +0&#e0e0e08|i|m@1|e|d|i|a|t|e| |i|n|f|o| |3| | +0#4040ff13#ffffff0@9
+ |~| @23| +0#0000001#e0e0e08|a|n|o|t|w|r|d| |W| |e|x|t|r|a| |t|e|x|t| | 
+0#4040ff13#ffffff0@27
+ |~| @23| +0#0000001#ffd7ff255|n|o|a|w|r|d| @1|W| |e|x|t|r|a| |t|e|x|t| | 
+0#4040ff13#ffffff0@27
+ |~| @23| +0#0000001#ffd7ff255|t|h|a|t|w|r|d| |W| |e|x|t|r|a| |t|e|x|t| | 
+0#4040ff13#ffffff0@27
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |-+2#0000000&@1| |U|s|e|r| |d|e|f|i|n|e|d| |c|o|m|p|l|e|t|i|o|n| 
|(|^|U|^|N|^|P|)| |m+0#00e0003&|a|t|c|h| |2| |o|f| |4| +0#0000000&@26
*** ../vim-8.1.2191/src/testdir/dumps/Test_popupwin_infopopup_hidden_3.dump     
2019-10-20 18:14:53.760037817 +0200
--- src/testdir/dumps/Test_popupwin_infopopup_hidden_3.dump     2019-10-20 
17:53:04.662694143 +0200
***************
*** 0 ****
--- 1,14 ----
+ |t+0&#ffffff0|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| |t|e|x|t| |t|n|o|i|n|f|o> 
@42
+ |~+0#4040ff13&| @23| +0#0000001#ffd7ff255|w|r|d| @4|W| |e|x|t|r|a| |t|e|x|t| 
| +0&#e0e0e08|a|s|y|n|c| |i|n|f|o| |4| | +0#4040ff13#ffffff0@13
+ |~| @23| +0#0000001#ffd7ff255|a|n|o|t|w|r|d| |W| |e|x|t|r|a| |t|e|x|t| | 
+0#4040ff13#ffffff0@27
+ |~| @23| +0#0000001#e0e0e08|n|o|a|w|r|d| @1|W| |e|x|t|r|a| |t|e|x|t| | 
+0#4040ff13#ffffff0@27
+ |~| @23| +0#0000001#ffd7ff255|t|h|a|t|w|r|d| |W| |e|x|t|r|a| |t|e|x|t| | 
+0#4040ff13#ffffff0@27
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |-+2#0000000&@1| |U|s|e|r| |d|e|f|i|n|e|d| |c|o|m|p|l|e|t|i|o|n| 
|(|^|U|^|N|^|P|)| |m+0#00e0003&|a|t|c|h| |3| |o|f| |4| +0#0000000&@26
*** ../vim-8.1.2191/src/version.c       2019-10-20 16:00:44.461152749 +0200
--- src/version.c       2019-10-20 18:14:38.912105156 +0200
***************
*** 743,744 ****
--- 743,746 ----
  {   /* Add new patch number below this line */
+ /**/
+     2192,
  /**/

-- 
Why I like vim:
> I like VIM because, when I ask a question in this newsgroup, I get a
> one-line answer.  With xemacs, I get a 1Kb lisp script with bugs in it ;-)

 /// 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/201910201618.x9KGIpNv025731%40masaka.moolenaar.net.

Raspunde prin e-mail lui