To: vim_dev@googlegroups.com Subject: Patch 8.0.1558 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.1558 Problem: No right-click menu in a terminal. Solution: Implement the right click menu for the terminal. Files: src/popupmnu.c, src/proto/popupmnu.pro, src/normal.c, src/menu.c, src/proto/menu.pro, src/feature.h *** ../vim-8.0.1557/src/popupmnu.c 2018-02-24 21:25:25.198496653 +0100 --- src/popupmnu.c 2018-03-03 18:58:06.048938213 +0100 *************** *** 422,430 **** char_u *st; int saved = *p; ! *p = NUL; st = transstr(s); ! *p = saved; #ifdef FEAT_RIGHTLEFT if (curwin->w_p_rl) { --- 422,432 ---- char_u *st; int saved = *p; ! if (saved != NUL) ! *p = NUL; st = transstr(s); ! if (saved != NUL) ! *p = saved; #ifdef FEAT_RIGHTLEFT if (curwin->w_p_rl) { *************** *** 830,835 **** --- 832,874 ---- return pum_height; } + # if defined(FEAT_BEVAL_TERM) || defined(FEAT_TERM_POPUP_MENU) || defined(PROTO) + static void + pum_position_at_mouse(int min_width) + { + if (Rows - mouse_row > pum_size) + { + /* Enough space below the mouse row. */ + pum_row = mouse_row + 1; + if (pum_height > Rows - pum_row) + pum_height = Rows - pum_row; + } + else + { + /* Show above the mouse row, reduce height if it does not fit. */ + pum_row = mouse_row - pum_size; + if (pum_row < 0) + { + pum_height += pum_row; + pum_row = 0; + } + } + if (Columns - mouse_col >= pum_base_width + || Columns - mouse_col > min_width) + /* Enough space to show at mouse column. */ + pum_col = mouse_col; + else + /* Not enough space, right align with window. */ + pum_col = Columns - (pum_base_width > min_width + ? min_width : pum_base_width); + + pum_width = Columns - pum_col; + if (pum_width > pum_base_width + 1) + pum_width = pum_base_width + 1; + } + + # endif + # if defined(FEAT_BEVAL_TERM) || defined(PROTO) static pumitem_T *balloon_array = NULL; static int balloon_arraysize; *************** *** 1028,1063 **** pum_scrollbar = 0; pum_height = balloon_arraysize; ! if (Rows - mouse_row > pum_size) ! { ! /* Enough space below the mouse row. */ ! pum_row = mouse_row + 1; ! if (pum_height > Rows - pum_row) ! pum_height = Rows - pum_row; ! } ! else ! { ! /* Show above the mouse row, reduce height if it does not fit. */ ! pum_row = mouse_row - pum_size; ! if (pum_row < 0) ! { ! pum_height += pum_row; ! pum_row = 0; ! } ! } ! if (Columns - mouse_col >= pum_base_width ! || Columns - mouse_col > BALLOON_MIN_WIDTH) ! /* Enough space to show at mouse column. */ ! pum_col = mouse_col; ! else ! /* Not enough space, right align with window. */ ! pum_col = Columns - (pum_base_width > BALLOON_MIN_WIDTH ! ? BALLOON_MIN_WIDTH : pum_base_width); ! ! pum_width = Columns - pum_col; ! if (pum_width > pum_base_width + 1) ! pum_width = pum_base_width + 1; ! pum_selected = -1; pum_first = 0; pum_redraw(); --- 1067,1073 ---- pum_scrollbar = 0; pum_height = balloon_arraysize; ! pum_position_at_mouse(BALLOON_MIN_WIDTH); pum_selected = -1; pum_first = 0; pum_redraw(); *************** *** 1075,1078 **** --- 1085,1237 ---- } # endif + # if defined(FEAT_TERM_POPUP_MENU) || defined(PROTO) + /* + * Select the pum entry at the mouse position. + */ + static void + pum_select_mouse_pos(void) + { + int idx = mouse_row - pum_row; + + if (idx < 0 || idx >= pum_size) + pum_selected = -1; + else if (*pum_array[idx].pum_text != NUL) + pum_selected = idx; + } + + /* + * Execute the currently selected popup menu item. + */ + static void + pum_execute_menu(vimmenu_T *menu) + { + vimmenu_T *mp; + int idx = 0; + exarg_T ea; + + for (mp = menu->children; mp != NULL; mp = mp->next) + if (idx++ == pum_selected) + { + vim_memset(&ea, 0, sizeof(ea)); + execute_menu(&ea, mp); + break; + } + } + + /* + * Open the terminal version of the popup menu and don't return until it is + * closed. + */ + void + pum_show_popupmenu(vimmenu_T *menu) + { + vimmenu_T *mp; + int idx = 0; + pumitem_T *array; + #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) + return; + + 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; + pum_compute_size(); + pum_scrollbar = 0; + pum_height = pum_size; + pum_position_at_mouse(20); + + pum_selected = -1; + pum_first = 0; + # ifdef FEAT_BEVAL_TERM + p_bevalterm = TRUE; /* track mouse movement */ + mch_setmouse(TRUE); + # endif + + for (;;) + { + int c; + + pum_redraw(); + setcursor(); + out_flush(); + + c = vgetc(); + if (c == ESC) + break; + else if (c == CAR || c == NL) + { + /* enter: select current item, if any, and close */ + pum_execute_menu(menu); + break; + } + else if (c == 'k' || c == K_UP || c == K_MOUSEUP) + { + /* cursor up: select previous item */ + while (pum_selected > 0) + { + --pum_selected; + if (*array[pum_selected].pum_text != NUL) + break; + } + } + else if (c == 'j' || c == K_DOWN || c == K_MOUSEDOWN) + { + /* cursor down: select next item */ + while (pum_selected < pum_size - 1) + { + ++pum_selected; + if (*array[pum_selected].pum_text != NUL) + break; + } + } + else if (c == K_RIGHTMOUSE) + { + /* Right mouse down: reposition the menu. */ + vungetc(c); + break; + } + else if (c == K_LEFTDRAG || c == K_RIGHTDRAG || c == K_MOUSEMOVE) + { + /* mouse moved: selec item in the mouse row */ + pum_select_mouse_pos(); + } + else if (c == K_LEFTMOUSE || c == K_LEFTMOUSE_NM || c == K_RIGHTRELEASE) + { + /* left mouse click: select clicked item, if any, and close; + * right mouse release: select clicked item, close if any */ + pum_select_mouse_pos(); + if (pum_selected >= 0) + { + pum_execute_menu(menu); + break; + } + if (c == K_LEFTMOUSE || c == K_LEFTMOUSE_NM) + break; + } + } + + vim_free(array); + pum_undisplay(); + # ifdef FEAT_BEVAL_TERM + p_bevalterm = save_bevalterm; + mch_setmouse(TRUE); + # endif + } + # endif + #endif *** ../vim-8.0.1557/src/proto/popupmnu.pro 2017-11-19 19:56:21.609895094 +0100 --- src/proto/popupmnu.pro 2018-03-03 16:04:27.149889136 +0100 *************** *** 9,12 **** --- 9,13 ---- void ui_remove_balloon(void); void ui_post_balloon(char_u *mesg, list_T *list); void ui_may_remove_balloon(void); + void pum_show_popupmenu(vimmenu_T *menu); /* vim: set ft=c : */ *** ../vim-8.0.1557/src/normal.c 2018-02-18 22:13:06.261057963 +0100 --- src/normal.c 2018-03-03 17:32:51.768702404 +0100 *************** *** 2286,2297 **** * Do the appropriate action for the current mouse click in the current mode. * Not used for Command-line mode. * ! * Normal Mode: * event modi- position visual change action * fier cursor window * left press - yes end yes * left press C yes end yes "^]" (2) ! * left press S yes end yes "*" (2) * left drag - yes start if moved no * left relse - yes start if moved no * middle press - yes if not active no put register --- 2286,2297 ---- * Do the appropriate action for the current mouse click in the current mode. * Not used for Command-line mode. * ! * Normal and Visual Mode: * event modi- position visual change action * fier cursor window * left press - yes end yes * left press C yes end yes "^]" (2) ! * left press S yes end (popup: extend) yes "*" (2) * left drag - yes start if moved no * left relse - yes start if moved no * middle press - yes if not active no put register *************** *** 2670,2751 **** if (which_button == MOUSE_RIGHT && !(mod_mask & (MOD_MASK_SHIFT | MOD_MASK_CTRL))) { - /* - * NOTE: Ignore right button down and drag mouse events. - * Windows only shows the popup menu on the button up event. - */ #if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) \ || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC) if (!is_click) return FALSE; #endif ! #if defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MSWIN) ! if (is_click || is_drag) ! return FALSE; ! #endif ! #if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) \ ! || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MSWIN) \ ! || defined(FEAT_GUI_MAC) || defined(FEAT_GUI_PHOTON) ! if (gui.in_use) { ! jump_flags = 0; ! if (STRCMP(p_mousem, "popup_setpos") == 0) { ! /* First set the cursor position before showing the popup ! * menu. */ ! if (VIsual_active) ! { ! pos_T m_pos; ! /* ! * set MOUSE_MAY_STOP_VIS if we are outside the ! * selection or the current window (might have false ! * negative here) ! */ ! if (mouse_row < curwin->w_winrow ! || mouse_row ! > (curwin->w_winrow + curwin->w_height)) ! jump_flags = MOUSE_MAY_STOP_VIS; ! else if (get_fpos_of_mouse(&m_pos) != IN_BUFFER) jump_flags = MOUSE_MAY_STOP_VIS; ! else { ! if ((LT_POS(curwin->w_cursor, VIsual) ! && (LT_POS(m_pos, curwin->w_cursor) ! || LT_POS(VIsual, m_pos))) ! || (LT_POS(VIsual, curwin->w_cursor) ! && (LT_POS(m_pos, VIsual) ! || LT_POS(curwin->w_cursor, m_pos)))) ! { jump_flags = MOUSE_MAY_STOP_VIS; - } - else if (VIsual_mode == Ctrl_V) - { - getvcols(curwin, &curwin->w_cursor, &VIsual, - &leftcol, &rightcol); - getvcol(curwin, &m_pos, NULL, &m_pos.col, NULL); - if (m_pos.col < leftcol || m_pos.col > rightcol) - jump_flags = MOUSE_MAY_STOP_VIS; - } } } - else - jump_flags = MOUSE_MAY_STOP_VIS; - } - if (jump_flags) - { - jump_flags = jump_to_mouse(jump_flags, NULL, which_button); - update_curbuf(VIsual_active ? INVERTED : VALID); - setcursor(); - out_flush(); /* Update before showing popup menu */ } # ifdef FEAT_MENU ! gui_show_popupmenu(); # endif ! return (jump_flags & CURSOR_MOVED) != 0; ! } ! else ! return FALSE; #else return FALSE; #endif --- 2670,2763 ---- if (which_button == MOUSE_RIGHT && !(mod_mask & (MOD_MASK_SHIFT | MOD_MASK_CTRL))) { #if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) \ + || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MSWIN) \ + || defined(FEAT_GUI_MAC) || defined(FEAT_GUI_PHOTON) \ + || defined(FEAT_TERM_POPUP_MENU) + # ifdef FEAT_GUI + if (gui.in_use) + { + # if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) \ || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC) + if (!is_click) + /* Ignore right button release events, only shows the popup + * menu on the button down event. */ + return FALSE; + # endif + # if defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MSWIN) + if (is_click || is_drag) + /* Ignore right button down and drag mouse events. Windows + * only shows the popup menu on the button up event. */ + return FALSE; + # endif + } + # endif + # if defined(FEAT_GUI) && defined(FEAT_TERM_POPUP_MENU) + else + # endif + # if defined(FEAT_TERM_POPUP_MENU) if (!is_click) + /* Ignore right button release events, only shows the popup + * menu on the button down event. */ return FALSE; #endif ! ! jump_flags = 0; ! if (STRCMP(p_mousem, "popup_setpos") == 0) { ! /* First set the cursor position before showing the popup ! * menu. */ ! if (VIsual_active) { ! pos_T m_pos; ! /* ! * set MOUSE_MAY_STOP_VIS if we are outside the ! * selection or the current window (might have false ! * negative here) ! */ ! if (mouse_row < curwin->w_winrow ! || mouse_row ! > (curwin->w_winrow + curwin->w_height)) ! jump_flags = MOUSE_MAY_STOP_VIS; ! else if (get_fpos_of_mouse(&m_pos) != IN_BUFFER) ! jump_flags = MOUSE_MAY_STOP_VIS; ! else ! { ! if ((LT_POS(curwin->w_cursor, VIsual) ! && (LT_POS(m_pos, curwin->w_cursor) ! || LT_POS(VIsual, m_pos))) ! || (LT_POS(VIsual, curwin->w_cursor) ! && (LT_POS(m_pos, VIsual) ! || LT_POS(curwin->w_cursor, m_pos)))) ! { jump_flags = MOUSE_MAY_STOP_VIS; ! } ! else if (VIsual_mode == Ctrl_V) { ! getvcols(curwin, &curwin->w_cursor, &VIsual, ! &leftcol, &rightcol); ! getvcol(curwin, &m_pos, NULL, &m_pos.col, NULL); ! if (m_pos.col < leftcol || m_pos.col > rightcol) jump_flags = MOUSE_MAY_STOP_VIS; } } } + else + jump_flags = MOUSE_MAY_STOP_VIS; + } + if (jump_flags) + { + jump_flags = jump_to_mouse(jump_flags, NULL, which_button); + update_curbuf(VIsual_active ? INVERTED : VALID); + setcursor(); + out_flush(); /* Update before showing popup menu */ + } # ifdef FEAT_MENU ! show_popupmenu(); ! got_click = FALSE; /* ignore release events */ # endif ! return (jump_flags & CURSOR_MOVED) != 0; #else return FALSE; #endif *** ../vim-8.0.1557/src/menu.c 2018-02-10 18:45:21.068822158 +0100 --- src/menu.c 2018-03-03 18:01:33.381966313 +0100 *************** *** 34,43 **** static int get_menu_cmd_modes(char_u *, int, int *, int *); static char_u *popup_mode_name(char_u *name, int idx); static char_u *menu_text(char_u *text, int *mnemonic, char_u **actext); - #ifdef FEAT_GUI - static int get_menu_mode(void); - static void gui_update_menus_recurse(vimmenu_T *, int); - #endif #if defined(FEAT_GUI_W32) && defined(FEAT_TEAROFF) static void gui_create_tearoffs_recurse(vimmenu_T *menu, const char_u *pname, int *pri_tab, int pri_idx); --- 34,39 ---- *************** *** 1871,1877 **** } #endif ! #ifdef FEAT_GUI static int get_menu_mode(void) --- 1867,1873 ---- } #endif ! #if defined(FEAT_GUI) || defined(FEAT_TERM_POPUP_MENU) || defined(PROTO) static int get_menu_mode(void) *************** *** 1896,1901 **** --- 1892,1951 ---- } /* + * 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, + * etc. + */ + void + show_popupmenu(void) + { + vimmenu_T *menu; + int mode; + + mode = get_menu_mode(); + if (mode == MENU_INDEX_INVALID) + return; + mode = menu_mode_chars[mode]; + + # ifdef FEAT_AUTOCMD + { + char_u ename[2]; + + ename[0] = mode; + ename[1] = NUL; + apply_autocmds(EVENT_MENUPOPUP, ename, NULL, FALSE, curbuf); + } + # endif + + for (menu = root_menu; menu != NULL; menu = menu->next) + if (STRNCMP("PopUp", menu->name, 5) == 0 && menu->name[5] == mode) + break; + + /* Only show a popup when it is defined and has entries */ + if (menu != NULL && menu->children != NULL) + { + # if defined(FEAT_GUI) + if (gui.in_use) + { + /* Update the menus now, in case the MenuPopup autocommand did + * anything. */ + gui_update_menus(0); + gui_mch_show_popupmenu(menu); + } + # endif + # if defined(FEAT_GUI) && defined(FEAT_TERM_POPUP_MENU) + else + # endif + # if defined(FEAT_TERM_POPUP_MENU) + pum_show_popupmenu(menu); + # endif + } + } + #endif + + #if defined(FEAT_GUI) || defined(PROTO) + + /* * Check that a pointer appears in the menu tree. Used to protect from using * a menu that was deleted after it was selected but before the event was * handled. *************** *** 1955,1982 **** while (menu) { if ((menu->modes & menu->enabled & mode) ! #if defined(FEAT_GUI_W32) && defined(FEAT_TEAROFF) || menu_is_tearoff(menu->dname) ! #endif ) grey = FALSE; else grey = TRUE; ! #ifdef FEAT_GUI_ATHENA /* Hiding menus doesn't work for Athena, it can cause a crash. */ gui_mch_menu_grey(menu, grey); ! #else /* Never hide a toplevel menu, it may make the menubar resize or * disappear. Same problem for ToolBar items. */ if (vim_strchr(p_go, GO_GREY) != NULL || menu->parent == NULL ! # ifdef FEAT_TOOLBAR || menu_is_toolbar(menu->parent->name) ! # endif ) gui_mch_menu_grey(menu, grey); else gui_mch_menu_hidden(menu, grey); ! #endif gui_update_menus_recurse(menu->children, mode); menu = menu->next; } --- 2005,2032 ---- while (menu) { if ((menu->modes & menu->enabled & mode) ! # if defined(FEAT_GUI_W32) && defined(FEAT_TEAROFF) || menu_is_tearoff(menu->dname) ! # endif ) grey = FALSE; else grey = TRUE; ! # ifdef FEAT_GUI_ATHENA /* Hiding menus doesn't work for Athena, it can cause a crash. */ gui_mch_menu_grey(menu, grey); ! # else /* Never hide a toplevel menu, it may make the menubar resize or * disappear. Same problem for ToolBar items. */ if (vim_strchr(p_go, GO_GREY) != NULL || menu->parent == NULL ! # ifdef FEAT_TOOLBAR || menu_is_toolbar(menu->parent->name) ! # endif ) gui_mch_menu_grey(menu, grey); else gui_mch_menu_hidden(menu, grey); ! # endif gui_update_menus_recurse(menu->children, mode); menu = menu->next; } *************** *** 2010,2024 **** gui_mch_draw_menubar(); prev_mode = mode; force_menu_update = FALSE; ! #ifdef FEAT_GUI_W32 /* This can leave a tearoff as active window - make sure we * have the focus */ gui_mch_activate_window(); ! #endif } } ! #if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) \ || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(PROTO) /* * Check if a key is used as a mnemonic for a toplevel menu. --- 2060,2074 ---- gui_mch_draw_menubar(); prev_mode = mode; force_menu_update = FALSE; ! # ifdef FEAT_GUI_W32 /* This can leave a tearoff as active window - make sure we * have the focus */ gui_mch_activate_window(); ! # endif } } ! # if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) \ || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(PROTO) /* * Check if a key is used as a mnemonic for a toplevel menu. *************** *** 2037,2083 **** return TRUE; return FALSE; } ! #endif ! ! /* ! * 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, ! * etc. ! */ ! void ! gui_show_popupmenu(void) ! { ! vimmenu_T *menu; ! int mode; ! ! mode = get_menu_mode(); ! if (mode == MENU_INDEX_INVALID) ! return; ! mode = menu_mode_chars[mode]; ! ! #ifdef FEAT_AUTOCMD ! { ! char_u ename[2]; ! ! ename[0] = mode; ! ename[1] = NUL; ! apply_autocmds(EVENT_MENUPOPUP, ename, NULL, FALSE, curbuf); ! } ! #endif ! ! for (menu = root_menu; menu != NULL; menu = menu->next) ! if (STRNCMP("PopUp", menu->name, 5) == 0 && menu->name[5] == mode) ! break; ! ! /* Only show a popup when it is defined and has entries */ ! if (menu != NULL && menu->children != NULL) ! { ! /* Update the menus now, in case the MenuPopup autocommand did ! * anything. */ ! gui_update_menus(0); ! gui_mch_show_popupmenu(menu); ! } ! } #endif /* FEAT_GUI */ #if (defined(FEAT_GUI_W32) && defined(FEAT_TEAROFF)) || defined(PROTO) --- 2087,2093 ---- return TRUE; return FALSE; } ! # endif #endif /* FEAT_GUI */ #if (defined(FEAT_GUI_W32) && defined(FEAT_TEAROFF)) || defined(PROTO) *************** *** 2238,2244 **** * Execute "menu". Use by ":emenu" and the window toolbar. * "eap" is NULL for the window toolbar. */ ! static void execute_menu(exarg_T *eap, vimmenu_T *menu) { char_u *mode; --- 2248,2254 ---- * Execute "menu". Use by ":emenu" and the window toolbar. * "eap" is NULL for the window toolbar. */ ! void execute_menu(exarg_T *eap, vimmenu_T *menu) { char_u *mode; *** ../vim-8.0.1557/src/proto/menu.pro 2017-09-17 23:02:17.168074448 +0200 --- src/proto/menu.pro 2018-03-03 18:01:49.837863865 +0100 *************** *** 12,23 **** int menu_is_child_of_popup(vimmenu_T *menu); int menu_is_toolbar(char_u *name); int menu_is_separator(char_u *name); int check_menu_pointer(vimmenu_T *root, vimmenu_T *menu_to_check); void gui_create_initial_menus(vimmenu_T *menu); void gui_update_menus(int modes); int gui_is_menu_shortcut(int key); - void gui_show_popupmenu(void); void gui_mch_toggle_tearoffs(int enable); void ex_emenu(exarg_T *eap); void winbar_click(win_T *wp, int col); vimmenu_T *gui_find_menu(char_u *path_name); --- 12,24 ---- int menu_is_child_of_popup(vimmenu_T *menu); int menu_is_toolbar(char_u *name); int menu_is_separator(char_u *name); + void show_popupmenu(void); int check_menu_pointer(vimmenu_T *root, vimmenu_T *menu_to_check); void gui_create_initial_menus(vimmenu_T *menu); void gui_update_menus(int modes); int gui_is_menu_shortcut(int key); void gui_mch_toggle_tearoffs(int enable); + void execute_menu(exarg_T *eap, vimmenu_T *menu); void ex_emenu(exarg_T *eap); void winbar_click(win_T *wp, int col); vimmenu_T *gui_find_menu(char_u *path_name); *** ../vim-8.0.1557/src/feature.h 2018-02-22 21:06:44.558819084 +0100 --- src/feature.h 2018-03-03 15:47:57.728028840 +0100 *************** *** 726,731 **** --- 726,738 ---- # endif #endif + /* + * popup menu in a terminal + */ + #if defined(FEAT_MENU) && !defined(ALWAYS_USE_GUI) && defined(FEAT_INS_EXPAND) + # define FEAT_TERM_POPUP_MENU + #endif + /* There are two ways to use XPM. */ #if (defined(HAVE_XM_XPMP_H) && defined(FEAT_GUI_MOTIF)) \ || defined(HAVE_X11_XPM_H) *** ../vim-8.0.1557/src/version.c 2018-03-03 15:06:48.383228973 +0100 --- src/version.c 2018-03-03 18:57:14.553257576 +0100 *************** *** 780,781 **** --- 780,783 ---- { /* Add new patch number below this line */ + /**/ + 1558, /**/ -- I am always surprised in the Linux world how quickly solutions can be obtained. (Imagine sending an email to Bill Gates, asking why Windows crashed, and how to fix it... and then getting an answer that fixed the problem... <0>_<0> !) -- Mark Langdon /// 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 ///