# HG changeset patch # User Bram Moolenaar # Date 1546776909 -3600 # Node ID 6012cc6936f7984226330021ad6e20a3ad097484 # Parent 13a34f8e996b322e02c47fbfb3e1471af7b46f66 patch 8.1.0695: internal error when using :popup commit https://github.com/vim/vim/commit/f42b45d719e03218735b3c2845a74dca9c0efd60 Author: Bram Moolenaar 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) diff --git a/runtime/doc/gui.txt b/runtime/doc/gui.txt --- 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 diff --git a/src/globals.h b/src/globals.h --- 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); diff --git a/src/menu.c b/src/menu.c --- 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; } diff --git a/src/popupmnu.c b/src/popupmnu.c --- 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; diff --git a/src/testdir/test_popup.vim b/src/testdir/test_popup.vim --- 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"+gP "+ + 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 diff --git a/src/version.c b/src/version.c --- 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,