Thanks a lot, I always can't remember my keymaps and need to check the vimrc 
again and again when I forget some. popup windows will help me and other 
newbees.

An issue has been found during my test: 

When you are navigating the items in the popup with arrow keys, you can see the 
cursor is visible and locate just behind the current selected item.

I suppose cursor should be invisible when popup window is in-use ??

And on last thing, special character '&' can not be used in the TUI popup,

:amenu PopUp.Cscope\ &Definition  :cs find g <c-R>=expand("<cword>")<cr><cr>
:amenu PopUp.Cscope\ &Symbol:cs find s <c-R>=expand("<cword>")<cr><cr>
:amenu PopUp.Cscope\ &Callee:cs find c <c-R>=expand("<cword>")<cr><cr>
:amenu PopUp.Cscope\ &Assigned:cs find a <c-R>=expand("<cword>")<cr><cr>

I always forget cscope commands, so, it's necessary for me to put them into a 
popup menu and give each item a shortcut by using '&'.

This shortcuts can be used on gvim but it doesn't work in TUI now.


在 2018年3月6日星期二 UTC+8上午4:07:01,Bram Moolenaar写道:
> Patch 8.0.1570
> Problem:    Can't use :popup for a menu in the terminal. (Wei Zhang)
> Solution:   Make :popup work in the terminal.  Also fix that entries were
>             included that don't work in the current state.
> Files:      src/ex_docmd.c, src/popupmnu.c, src/proto/popupmnu.pro,
>             src/menu.c, src/proto/menu.pro
> 
> 
> *** ../vim-8.0.1569/src/ex_docmd.c    2018-03-04 20:14:08.244064367 +0100
> --- src/ex_docmd.c    2018-03-05 20:33:27.651337765 +0100
> ***************
> *** 204,210 ****
>   #else
>   # define ex_tearoff         ex_ni
>   #endif
> ! #if (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_GTK)) && defined(FEAT_MENU)
>   static void ex_popup(exarg_T *eap);
>   #else
>   # define ex_popup           ex_ni
> --- 204,211 ----
>   #else
>   # define ex_tearoff         ex_ni
>   #endif
> ! #if (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_GTK) \
> !     || defined(FEAT_TERM_POPUP_MENU)) && defined(FEAT_MENU)
>   static void ex_popup(exarg_T *eap);
>   #else
>   # define ex_popup           ex_ni
> ***************
> *** 8741,8751 ****
>   }
>   #endif
>   
> ! #if (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_GTK)) && defined(FEAT_MENU)
>       static void
>   ex_popup(exarg_T *eap)
>   {
> !     gui_make_popup(eap->arg, eap->forceit);
>   }
>   #endif
>   
> --- 8742,8762 ----
>   }
>   #endif
>   
> ! #if (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_GTK) \
> !     || defined(FEAT_TERM_POPUP_MENU)) && defined(FEAT_MENU)
>       static void
>   ex_popup(exarg_T *eap)
>   {
> ! # if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_GTK)
> !     if (gui.in_use)
> !     gui_make_popup(eap->arg, eap->forceit);
> ! #  ifdef FEAT_TERM_POPUP_MENU
> !     else
> ! #  endif
> ! # endif
> ! # ifdef FEAT_TERM_POPUP_MENU
> !     pum_make_popup(eap->arg, eap->forceit);
> ! # endif
>   }
>   #endif
>   
> *** ../vim-8.0.1569/src/popupmnu.c    2018-03-03 18:59:11.612531627 +0100
> --- src/popupmnu.c    2018-03-05 21:01:01.461275616 +0100
> ***************
> *** 1132,1143 ****
>   #ifdef FEAT_BEVAL_TERM
>       int             save_bevalterm = p_bevalterm;
>   #endif
>   
>       pum_undisplay();
>       pum_size = 0;
>   
>       for (mp = menu->children; mp != NULL; mp = mp->next)
> !     ++pum_size;
>   
>       array = (pumitem_T *)alloc_clear((unsigned)sizeof(pumitem_T) * 
> pum_size);
>       if (array == NULL)
> --- 1132,1147 ----
>   #ifdef FEAT_BEVAL_TERM
>       int             save_bevalterm = p_bevalterm;
>   #endif
> +     int             mode;
>   
>       pum_undisplay();
>       pum_size = 0;
> +     mode = get_menu_mode_flag();
>   
>       for (mp = menu->children; mp != NULL; mp = mp->next)
> !     if (menu_is_separator(mp->dname)
> !             || (mp->modes & mp->enabled & mode))
> !         ++pum_size;
>   
>       array = (pumitem_T *)alloc_clear((unsigned)sizeof(pumitem_T) * 
> pum_size);
>       if (array == NULL)
> ***************
> *** 1146,1152 ****
>       for (mp = menu->children; mp != NULL; mp = mp->next)
>       if (menu_is_separator(mp->dname))
>           array[idx++].pum_text = (char_u *)"";
> !     else
>           array[idx++].pum_text = mp->dname;
>   
>       pum_array = array;
> --- 1150,1156 ----
>       for (mp = menu->children; mp != NULL; mp = mp->next)
>       if (menu_is_separator(mp->dname))
>           array[idx++].pum_text = (char_u *)"";
> !     else if (mp->modes & mp->enabled & mode)
>           array[idx++].pum_text = mp->dname;
>   
>       pum_array = array;
> ***************
> *** 1232,1237 ****
> --- 1236,1259 ----
>       mch_setmouse(TRUE);
>   #  endif
>   }
> + 
> +     void
> + pum_make_popup(char_u *path_name, int use_mouse_pos)
> + {
> +     vimmenu_T *menu;
> + 
> +     if (!use_mouse_pos)
> +     {
> +     /* Hack: set mouse position at the cursor so that the menu pops up
> +      * around there. */
> +     mouse_row = curwin->w_winrow + curwin->w_wrow;
> +     mouse_col = curwin->w_wincol + curwin->w_wcol;
> +     }
> + 
> +     menu = gui_find_menu(path_name);
> +     if (menu != NULL)
> +     pum_show_popupmenu(menu);
> + }
>   # endif
>   
>   #endif
> *** ../vim-8.0.1569/src/proto/popupmnu.pro    2018-03-03 18:59:11.612531627 
> +0100
> --- src/proto/popupmnu.pro    2018-03-05 20:31:35.520024601 +0100
> ***************
> *** 10,13 ****
> --- 10,14 ----
>   void ui_post_balloon(char_u *mesg, list_T *list);
>   void ui_may_remove_balloon(void);
>   void pum_show_popupmenu(vimmenu_T *menu);
> + void pum_make_popup(char_u *path_name, int mouse_pos);
>   /* vim: set ft=c : */
> *** ../vim-8.0.1569/src/menu.c        2018-03-04 18:07:04.260592398 +0100
> --- src/menu.c        2018-03-05 21:06:04.967346391 +0100
> ***************
> *** 1891,1896 ****
> --- 1891,1906 ----
>       return MENU_INDEX_INVALID;
>   }
>   
> +     int
> + get_menu_mode_flag(void)
> + {
> +     int mode = get_menu_mode();
> + 
> +     if (mode == MENU_INDEX_INVALID)
> +     return 0;
> +     return 1 << mode;
> + }
> + 
>   /*
>    * Display the Special "PopUp" menu as a pop-up at the current mouse
>    * position.  The "PopUpn" menu is for Normal mode, "PopUpi" for Insert 
> mode,
> ***************
> *** 2044,2056 ****
>       if (modes != 0x0)
>       mode = modes;
>       else
> !     {
> !     mode = get_menu_mode();
> !     if (mode == MENU_INDEX_INVALID)
> !         mode = 0;
> !     else
> !         mode = (1 << mode);
> !     }
>   
>       if (force_menu_update || mode != prev_mode)
>       {
> --- 2054,2060 ----
>       if (modes != 0x0)
>       mode = modes;
>       else
> !     mode = get_menu_mode_flag();
>   
>       if (force_menu_update || mode != prev_mode)
>       {
> *** ../vim-8.0.1569/src/proto/menu.pro        2018-03-03 18:59:11.616531601 
> +0100
> --- src/proto/menu.pro        2018-03-05 20:52:27.192395127 +0100
> ***************
> *** 12,17 ****
> --- 12,18 ----
>   int menu_is_child_of_popup(vimmenu_T *menu);
>   int menu_is_toolbar(char_u *name);
>   int menu_is_separator(char_u *name);
> + int get_menu_mode_flag(void);
>   void show_popupmenu(void);
>   int check_menu_pointer(vimmenu_T *root, vimmenu_T *menu_to_check);
>   void gui_create_initial_menus(vimmenu_T *menu);
> *** ../vim-8.0.1569/src/version.c     2018-03-05 12:42:38.394154092 +0100
> --- src/version.c     2018-03-05 20:31:25.976083094 +0100
> ***************
> *** 768,769 ****
> --- 768,771 ----
>   {   /* Add new patch number below this line */
> + /**/
> +     1570,
>   /**/
> 
> -- 
> ARTHUR: Old woman!
> DENNIS: Man!
> ARTHUR: Man.  I'm sorry.  Old man, What knight live in that castle over there?
> DENNIS: I'm thirty-seven.
>                  "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
> 
>  /// Bram Moolenaar -- b...@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    ///

-- 
-- 
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 vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui