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 -- [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].
For more options, visit https://groups.google.com/d/optout.