To: vim_dev@googlegroups.com Subject: Patch 8.1.2192 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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\\") + call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_1', {}) + + call term_sendkeys(buf, "\") + call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_2', {}) + + call term_sendkeys(buf, "\") + call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_3', {}) + + call term_sendkeys(buf, "\") + 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 -- Bram@Moolenaar.net -- 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 ///