changeset 15375:6012cc6936f7 v8.1.0695

patch 8.1.0695: internal error when using :popup commit https://github.com/vim/vim/commit/f42b45d719e03218735b3c2845a74dca9c0efd60 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jan 6 13:11:05 2019 +0100 patch 8.1.0695: internal error when using :popup Problem: Internal error when using :popup. Solution: When a menu only exists in Terminal mode give an error. (Naruhiko Nishino, closes #3765)
author Bram Moolenaar <Bram@vim.org>
date Sun, 06 Jan 2019 13:15:09 +0100
parents 13a34f8e996b
children e2a7a22c6b53
files runtime/doc/gui.txt src/globals.h src/menu.c src/popupmnu.c src/testdir/test_popup.vim src/version.c
diffstat 6 files changed, 32 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/gui.txt
+++ b/runtime/doc/gui.txt
@@ -1,4 +1,4 @@
-*gui.txt*       For Vim version 8.1.  Last change: 2018 Mar 06
+*gui.txt*       For Vim version 8.1.  Last change: 2019 Jan 06
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -914,7 +914,9 @@ may be used to complete the name of the 
 To remove all menus use:			*:unmenu-all*  >
 	:unmenu *	" remove all menus in Normal and visual mode
 	:unmenu! *	" remove all menus in Insert and Command-line mode
-	:aunmenu *	" remove all menus in all modes
+	:aunmenu *	" remove all menus in all modes, except for Terminal
+			" mode
+	:tlunmenu *	" remove all menus in Terminal mode
 
 If you want to get rid of the menu bar: >
 	:set guioptions-=m
--- a/src/globals.h
+++ b/src/globals.h
@@ -1583,6 +1583,9 @@ EXTERN char_u e_invalidreg[]    INIT(= N
 #endif
 EXTERN char_u e_dirnotf[]	INIT(= N_("E919: Directory not found in '%s': \"%s\""));
 EXTERN char_u e_au_recursive[]	INIT(= N_("E952: Autocommand caused recursive behavior"));
+#ifdef FEAT_MENU
+EXTERN char_u e_menuothermode[] INIT(= N_("E328: Menu only exists in another mode"));
+#endif
 
 #ifdef FEAT_GUI_MAC
 EXTERN short disallow_gui	INIT(= FALSE);
--- a/src/menu.c
+++ b/src/menu.c
@@ -61,7 +61,6 @@ static char_u *menu_translate_tab_and_sh
 static char *menu_mode_chars[] = {"n", "v", "s", "o", "i", "c", "tl", "t"};
 
 static char_u e_notsubmenu[] = N_("E327: Part of menu-item path is not sub-menu");
-static char_u e_othermode[] = N_("E328: Menu only exists in another mode");
 static char_u e_nomenu[] = N_("E329: No menu \"%s\"");
 
 #ifdef FEAT_TOOLBAR
@@ -956,7 +955,7 @@ remove_menu(
 	    else if (*name != NUL)
 	    {
 		if (!silent)
-		    EMSG(_(e_othermode));
+		    EMSG(_(e_menuothermode));
 		return FAIL;
 	    }
 
@@ -1130,7 +1129,7 @@ show_menus(char_u *path_name, int modes)
 		}
 		else if ((menu->modes & modes) == 0x0)
 		{
-		    EMSG(_(e_othermode));
+		    EMSG(_(e_menuothermode));
 		    vim_free(path_name);
 		    return FAIL;
 		}
--- a/src/popupmnu.c
+++ b/src/popupmnu.c
@@ -1195,6 +1195,14 @@ pum_show_popupmenu(vimmenu_T *menu)
 		|| (mp->modes & mp->enabled & mode))
 	    ++pum_size;
 
+    // When there are only Terminal mode menus, using "popup Edit" results in
+    // pum_size being zero.
+    if (pum_size <= 0)
+    {
+	EMSG(e_menuothermode);
+	return;
+    }
+
     array = (pumitem_T *)alloc_clear((unsigned)sizeof(pumitem_T) * pum_size);
     if (array == NULL)
 	return;
--- a/src/testdir/test_popup.vim
+++ b/src/testdir/test_popup.vim
@@ -882,5 +882,18 @@ func Test_complete_o_tab()
   delfunc s:act_on_text_changed
 endfunc
 
+func Test_menu_only_exists_in_terminal()
+  if !exists(':tlmenu') || has('gui_running')
+    return
+  endif
+  tlnoremenu  &Edit.&Paste<Tab>"+gP  <C-W>"+
+  aunmenu *
+  try
+    popup Edit
+    call assert_false(1, 'command should have failed')
+  catch
+    call assert_exception('E328:')
+  endtry
+endfunc
 
 " vim: shiftwidth=2 sts=2 expandtab
--- a/src/version.c
+++ b/src/version.c
@@ -800,6 +800,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    695,
+/**/
     694,
 /**/
     693,