To: vim_dev@googlegroups.com Subject: Patch 9.0.0279 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.0279 Problem: The tiny version has the popup menu but not 'wildmenu'. Solution: Graduate the wildmenu feature. Files: runtime/doc/options.txt, runtime/doc/various.txt, src/feature.h, src/cmdexpand.c, src/drawscreen.c, src/evalfunc.c, src/ex_getln.c, src/highlight.c, src/popupmenu.c, src/screen.c, src/version.c, src/globals.h, src/option.h, src/optiondefs.h *** ../vim-9.0.0278/runtime/doc/options.txt 2022-08-26 16:41:10.033072432 +0100 --- runtime/doc/options.txt 2022-08-26 16:54:11.158356526 +0100 *************** *** 9018,9030 **** *'wildmenu'* *'wmnu'* *'nowildmenu'* *'nowmnu'* 'wildmenu' 'wmnu' boolean (default off, set in |defaults.vim|) global - {not available if compiled without the |+wildmenu| - feature} When 'wildmenu' is on, command-line completion operates in an enhanced mode. On pressing 'wildchar' (usually ) to invoke completion, ! the possible matches are shown just above the command line, with the ! first match highlighted (overwriting the status line, if there is ! one). This is the behavior without "pum" in 'wildoptions'. Keys that show the previous/next match, such as or CTRL-P/CTRL-N, cause the highlight to move to the appropriate match. When 'wildmode' is used, "wildmenu" mode is used where "full" is --- 9047,9059 ---- *'wildmenu'* *'wmnu'* *'nowildmenu'* *'nowmnu'* 'wildmenu' 'wmnu' boolean (default off, set in |defaults.vim|) global When 'wildmenu' is on, command-line completion operates in an enhanced mode. On pressing 'wildchar' (usually ) to invoke completion, ! the possible matches are shown. ! When 'wildoptions' contains "pum", then the completion matches are ! shown in a popup menu. Otherwise they are displayed just above the ! command line, with the first match highlighted (overwriting the status ! line, if there is one). Keys that show the previous/next match, such as or CTRL-P/CTRL-N, cause the highlight to move to the appropriate match. When 'wildmode' is used, "wildmenu" mode is used where "full" is *************** *** 9033,9040 **** If there are more matches than can fit in the line, a ">" is shown on the right and/or a "<" is shown on the left. The status line scrolls as needed. - When 'wildoptions' contains "pum", then the completion matches are - shown in a popup menu. The "wildmenu" mode is abandoned when a key is hit that is not used for selecting a completion. While the "wildmenu" is active, not using the popup menu, the --- 9062,9067 ---- *** ../vim-9.0.0278/runtime/doc/various.txt 2022-08-26 16:41:10.033072432 +0100 --- runtime/doc/various.txt 2022-08-26 16:54:35.370277307 +0100 *************** *** 492,498 **** T *+vreplace* |gR| and |gr| *+vtp* on MS-Windows console: support for 'termguicolors' T *+wildignore* |'wildignore'| Always enabled since 9.0.0278 ! N *+wildmenu* |'wildmenu'| T *+windows* more than one window; Always enabled since 8.0.1118. m *+writebackup* |'writebackup'| is default on m *+xim* X input method |xim| --- 492,498 ---- T *+vreplace* |gR| and |gr| *+vtp* on MS-Windows console: support for 'termguicolors' T *+wildignore* |'wildignore'| Always enabled since 9.0.0278 ! T *+wildmenu* |'wildmenu'|| Always enabled since 9.0.0279 T *+windows* more than one window; Always enabled since 8.0.1118. m *+writebackup* |'writebackup'| is default on m *+xim* X input method |xim| *** ../vim-9.0.0278/src/feature.h 2022-08-26 16:41:10.033072432 +0100 --- src/feature.h 2022-08-26 16:53:31.534486539 +0100 *************** *** 119,124 **** --- 119,125 ---- * +file_in_path "gf" and "" commands. * +path_extra up/downwards searching in 'path' and 'tags'. * +wildignore 'wildignore' and 'backupskip' options + * +wildmenu 'wildmenu' option * * Obsolete: * +tag_old_static Old style static tags: "file:tag file ..". *************** *** 339,351 **** #endif /* - * +wildmenu 'wildmenu' option - */ - #if defined(FEAT_NORMAL) - # define FEAT_WILDMENU - #endif - - /* * +viminfo reading/writing the viminfo file. Takes about 8Kbyte * of code. * VIMINFO_FILE Location of user .viminfo file (should start with $). --- 340,345 ---- *** ../vim-9.0.0278/src/cmdexpand.c 2022-08-21 14:33:53.938662514 +0100 --- src/cmdexpand.c 2022-08-26 16:50:44.711039767 +0100 *************** *** 26,32 **** static int ExpandUserList(expand_T *xp, char_u ***matches, int *numMatches); #endif - #ifdef FEAT_WILDMENU // "compl_match_array" points the currently displayed list of entries in the // popup menu. It is NULL when there is no popup menu. static pumitem_T *compl_match_array = NULL; --- 26,31 ---- *************** *** 34,40 **** // First column in cmdline of the matched item for completion. static int compl_startcol; static int compl_selected; - #endif #define SHOW_FILE_TEXT(m) (showtail ? sm_gettail(matches[m]) : matches[m]) --- 33,38 ---- *************** *** 305,312 **** return OK; } - #if defined(FEAT_WILDMENU) || defined(PROTO) - /* * Create and display a cmdline completion popup menu with items from * 'matches'. --- 303,308 ---- *************** *** 405,411 **** { return compl_startcol; } - #endif /* * Get the next or prev cmdline completion match. The index of the match is set --- 401,406 ---- *************** *** 488,494 **** else findex = -1; } - #ifdef FEAT_WILDMENU if (compl_match_array) { compl_selected = findex; --- 483,488 ---- *************** *** 497,503 **** else if (p_wmnu) win_redr_status_matches(xp, xp->xp_numfiles, xp->xp_files, findex, cmd_showtail); - #endif *p_findex = findex; if (findex == -1) --- 491,496 ---- *************** *** 902,917 **** showtail = cmd_showtail; } - #ifdef FEAT_WILDMENU if (wildmenu && vim_strchr(p_wop, WOP_PUM) != NULL) // cmdline completion popup menu (with wildoptions=pum) return cmdline_pum_create(ccline, xp, matches, numMatches, showtail); - #endif - #ifdef FEAT_WILDMENU if (!wildmenu) { - #endif msg_didany = FALSE; // lines_left will be set msg_start(); // prepare for paging msg_putchar('\n'); --- 895,906 ---- *************** *** 919,934 **** cmdline_row = msg_row; msg_didany = FALSE; // lines_left will be set again msg_start(); // prepare for paging - #ifdef FEAT_WILDMENU } - #endif if (got_int) got_int = FALSE; // only int. the completion, not the cmd line - #ifdef FEAT_WILDMENU else if (wildmenu) win_redr_status_matches(xp, numMatches, matches, -1, showtail); - #endif else { // find the length of the longest file name --- 908,919 ---- *************** *** 3378,3385 **** vim_free(buf); } - #ifdef FEAT_WILDMENU - /* * Translate some keys pressed when 'wildmenu' is used. */ --- 3363,3368 ---- *************** *** 3392,3398 **** { int c = key; - #ifdef FEAT_WILDMENU if (cmdline_pum_active()) { // When the popup menu is used for cmdline completion: --- 3375,3380 ---- *************** *** 3409,3415 **** default: break; } } - #endif if (did_wild_list) { --- 3391,3396 ---- *************** *** 3669,3675 **** if (cclp->input_fn) RedrawingDisabled = old_RedrawingDisabled; } - #endif #if defined(FEAT_EVAL) || defined(PROTO) /* --- 3650,3655 ---- *** ../vim-9.0.0278/src/drawscreen.c 2022-08-25 15:11:11.404084538 +0100 --- src/drawscreen.c 2022-08-26 16:51:03.486976964 +0100 *************** *** 3084,3102 **** } else if (State & MODE_CMDLINE) { - #ifdef FEAT_WILDMENU if (pum_visible()) cmdline_pum_display(); ! #endif // Don't redraw when in prompt_for_number(). if (cmdline_row > 0) { // Redrawing only works when the screen didn't scroll. Don't clear // wildmenu entries. if (msg_scrolled == 0 - #ifdef FEAT_WILDMENU && wild_menu_showing == 0 - #endif && call_update_screen) update_screen(0); --- 3084,3099 ---- } else if (State & MODE_CMDLINE) { if (pum_visible()) cmdline_pum_display(); ! // Don't redraw when in prompt_for_number(). if (cmdline_row > 0) { // Redrawing only works when the screen didn't scroll. Don't clear // wildmenu entries. if (msg_scrolled == 0 && wild_menu_showing == 0 && call_update_screen) update_screen(0); *************** *** 3241,3252 **** { win_T *wp; - #ifdef FEAT_WILDMENU if (wild_menu_showing != 0) // Don't redraw while the command line completion is displayed, it // would disappear. return; - #endif FOR_ALL_WINDOWS(wp) { if (wp->w_buffer == buf) --- 3238,3247 ---- *************** *** 3305,3311 **** draw_tabline(); } - #if defined(FEAT_WILDMENU) || defined(PROTO) /* * Redraw all status lines at the bottom of frame "frp". */ --- 3300,3305 ---- *************** *** 3327,3333 **** win_redraw_last_status(frp); } } - #endif /* * Changed something in the current window, at buffer line "lnum", that --- 3321,3326 ---- *** ../vim-9.0.0278/src/evalfunc.c 2022-08-26 16:41:10.033072432 +0100 --- src/evalfunc.c 2022-08-26 16:51:16.526933437 +0100 *************** *** 6261,6273 **** #endif }, {"wildignore", 1}, ! {"wildmenu", ! #ifdef FEAT_WILDMENU ! 1 ! #else ! 0 ! #endif ! }, {"windows", 1}, {"winaltkeys", #ifdef FEAT_WAK --- 6261,6267 ---- #endif }, {"wildignore", 1}, ! {"wildmenu", 1}, {"windows", 1}, {"winaltkeys", #ifdef FEAT_WAK *************** *** 10600,10609 **** static void f_wildmenumode(typval_T *argvars UNUSED, typval_T *rettv UNUSED) { - #ifdef FEAT_WILDMENU if (wild_menu_showing || ((State & MODE_CMDLINE) && cmdline_pum_active())) rettv->vval.v_number = 1; - #endif } /* --- 10594,10601 ---- *** ../vim-9.0.0278/src/ex_getln.c 2022-08-26 10:33:49.062709862 +0100 --- src/ex_getln.c 2022-08-26 16:52:36.470668022 +0100 *************** *** 920,936 **** if (xp->xp_numfiles > 1 && !*did_wild_list && ((wim_flags[wim_index] & WIM_LIST) ! #ifdef FEAT_WILDMENU ! || (p_wmnu && (wim_flags[wim_index] & WIM_FULL) != 0) ! #endif ! )) { - #ifdef FEAT_WILDMENU (void)showmatches(xp, p_wmnu && ((wim_flags[wim_index] & WIM_LIST) == 0)); - #else - (void)showmatches(xp, FALSE); - #endif redrawcmd(); *did_wild_list = TRUE; } --- 920,929 ---- if (xp->xp_numfiles > 1 && !*did_wild_list && ((wim_flags[wim_index] & WIM_LIST) ! || (p_wmnu && (wim_flags[wim_index] & WIM_FULL) != 0))) { (void)showmatches(xp, p_wmnu && ((wim_flags[wim_index] & WIM_LIST) == 0)); redrawcmd(); *did_wild_list = TRUE; } *************** *** 958,966 **** (void)vpeekc(); // remove from input stream got_int = FALSE; // don't abandon the command line (void)ExpandOne(xp, NULL, NULL, 0, WILD_FREE); - #ifdef FEAT_WILDMENU xp->xp_context = EXPAND_NOTHING; - #endif *wim_index_p = wim_index; return CMDLINE_CHANGED; } --- 951,957 ---- *************** *** 975,1003 **** if (wim_flags[0] == WIM_LONGEST && ccline.cmdpos == j) wim_index = 1; if ((wim_flags[wim_index] & WIM_LIST) ! #ifdef FEAT_WILDMENU ! || (p_wmnu && (wim_flags[wim_index] & WIM_FULL) != 0) ! #endif ! ) { if (!(wim_flags[0] & WIM_LONGEST)) { - #ifdef FEAT_WILDMENU int p_wmnu_save = p_wmnu; p_wmnu = 0; ! #endif // remove match nextwild(xp, WILD_PREV, 0, escape); - #ifdef FEAT_WILDMENU p_wmnu = p_wmnu_save; - #endif } - #ifdef FEAT_WILDMENU (void)showmatches(xp, p_wmnu && ((wim_flags[wim_index] & WIM_LIST) == 0)); - #else - (void)showmatches(xp, FALSE); - #endif redrawcmd(); *did_wild_list = TRUE; if (wim_flags[wim_index] & WIM_LONGEST) --- 966,985 ---- if (wim_flags[0] == WIM_LONGEST && ccline.cmdpos == j) wim_index = 1; if ((wim_flags[wim_index] & WIM_LIST) ! || (p_wmnu && (wim_flags[wim_index] & WIM_FULL) != 0)) { if (!(wim_flags[0] & WIM_LONGEST)) { int p_wmnu_save = p_wmnu; + p_wmnu = 0; ! // remove match nextwild(xp, WILD_PREV, 0, escape); p_wmnu = p_wmnu_save; } (void)showmatches(xp, p_wmnu && ((wim_flags[wim_index] & WIM_LIST) == 0)); redrawcmd(); *did_wild_list = TRUE; if (wim_flags[wim_index] & WIM_LONGEST) *************** *** 1008,1017 **** else vim_beep(BO_WILD); } - #ifdef FEAT_WILDMENU else if (xp->xp_numfiles == -1) xp->xp_context = EXPAND_NOTHING; - #endif } if (wim_index < 3) ++wim_index; --- 990,997 ---- *************** *** 1895,1901 **** if (c != p_wc && c == K_S_TAB && xpc.xp_numfiles > 0) c = Ctrl_P; - #ifdef FEAT_WILDMENU if (p_wmnu) c = wildmenu_translate_key(&ccline, c, &xpc, did_wild_list); --- 1875,1880 ---- *************** *** 1913,1919 **** c = Ctrl_E; } } - #endif // The wildmenu is cleared if the pressed key is not used for // navigating the wild menu (i.e. the key is not 'wildchar' or --- 1892,1897 ---- *************** *** 1922,1957 **** // also used to navigate the menu. end_wildmenu = (!(c == p_wc && KeyTyped) && c != p_wcm && c != Ctrl_N && c != Ctrl_P && c != Ctrl_A && c != Ctrl_L); - #ifdef FEAT_WILDMENU end_wildmenu = end_wildmenu && (!cmdline_pum_active() || (c != K_PAGEDOWN && c != K_PAGEUP && c != K_KPAGEDOWN && c != K_KPAGEUP)); - #endif // free expanded names when finished walking through matches if (end_wildmenu) { - #ifdef FEAT_WILDMENU if (cmdline_pum_active()) cmdline_pum_remove(); - #endif if (xpc.xp_numfiles != -1) (void)ExpandOne(&xpc, NULL, NULL, 0, WILD_FREE); did_wild_list = FALSE; - #ifdef FEAT_WILDMENU if (!p_wmnu || (c != K_UP && c != K_DOWN)) - #endif xpc.xp_context = EXPAND_NOTHING; wim_index = 0; - #ifdef FEAT_WILDMENU wildmenu_cleanup(&ccline); - #endif } - #ifdef FEAT_WILDMENU if (p_wmnu) c = wildmenu_process_key(&ccline, c, &xpc); - #endif // CTRL-\ CTRL-N goes to Normal mode, CTRL-\ CTRL-G goes to Insert // mode when 'insertmode' is set, CTRL-\ e prompts for an expression. --- 1900,1925 ---- *************** *** 2035,2052 **** { if (xpc.xp_numfiles > 1 && ((!did_wild_list && (wim_flags[wim_index] & WIM_LIST)) ! #ifdef FEAT_WILDMENU ! || p_wmnu ! #endif ! )) { - #ifdef FEAT_WILDMENU // Trigger the popup menu when wildoptions=pum showmatches(&xpc, p_wmnu && ((wim_flags[wim_index] & WIM_LIST) == 0)); - #else - (void)showmatches(&xpc, FALSE); - #endif } if (nextwild(&xpc, WILD_PREV, 0, firstc != '@') == OK && nextwild(&xpc, WILD_PREV, 0, firstc != '@') == OK) --- 2003,2013 ---- { if (xpc.xp_numfiles > 1 && ((!did_wild_list && (wim_flags[wim_index] & WIM_LIST)) ! || p_wmnu)) { // Trigger the popup menu when wildoptions=pum showmatches(&xpc, p_wmnu && ((wim_flags[wim_index] & WIM_LIST) == 0)); } if (nextwild(&xpc, WILD_PREV, 0, firstc != '@') == OK && nextwild(&xpc, WILD_PREV, 0, firstc != '@') == OK) *************** *** 2318,2329 **** goto cmdline_not_changed; case Ctrl_A: // all matches - #ifdef FEAT_WILDMENU if (cmdline_pum_active()) // As Ctrl-A completes all the matches, close the popup // menu (if present) cmdline_pum_cleanup(&ccline); ! #endif if (nextwild(&xpc, WILD_ALL, 0, firstc != '@') == FAIL) break; xpc.xp_context = EXPAND_NOTHING; --- 2279,2289 ---- goto cmdline_not_changed; case Ctrl_A: // all matches if (cmdline_pum_active()) // As Ctrl-A completes all the matches, close the popup // menu (if present) cmdline_pum_cleanup(&ccline); ! if (nextwild(&xpc, WILD_ALL, 0, firstc != '@') == FAIL) break; xpc.xp_context = EXPAND_NOTHING; *************** *** 2359,2365 **** case K_KPAGEUP: case K_PAGEDOWN: case K_KPAGEDOWN: - #ifdef FEAT_WILDMENU if (cmdline_pum_active() && (c == K_PAGEUP || c == K_PAGEDOWN || c == K_KPAGEUP || c == K_KPAGEDOWN)) --- 2319,2324 ---- *************** *** 2374,2380 **** goto cmdline_not_changed; } else - #endif { res = cmdline_browse_history(c, firstc, &lookfor, histype, &hiscnt, &xpc); --- 2333,2338 ---- *** ../vim-9.0.0278/src/highlight.c 2022-08-22 15:19:12.732328943 +0100 --- src/highlight.c 2022-08-26 16:52:46.298635551 +0100 *************** *** 204,213 **** "Title term=bold ctermfg=DarkMagenta gui=bold guifg=Magenta"), CENT("WarningMsg term=standout ctermfg=DarkRed", "WarningMsg term=standout ctermfg=DarkRed guifg=Red"), - #ifdef FEAT_WILDMENU CENT("WildMenu term=standout ctermbg=Yellow ctermfg=Black", "WildMenu term=standout ctermbg=Yellow ctermfg=Black guibg=Yellow guifg=Black"), - #endif #ifdef FEAT_FOLDING CENT("Folded term=standout ctermbg=Grey ctermfg=DarkBlue", "Folded term=standout ctermbg=Grey ctermfg=DarkBlue guibg=LightGrey guifg=DarkBlue"), --- 204,211 ---- *************** *** 295,304 **** "Title term=bold ctermfg=LightMagenta gui=bold guifg=Magenta"), CENT("WarningMsg term=standout ctermfg=LightRed", "WarningMsg term=standout ctermfg=LightRed guifg=Red"), - #ifdef FEAT_WILDMENU CENT("WildMenu term=standout ctermbg=Yellow ctermfg=Black", "WildMenu term=standout ctermbg=Yellow ctermfg=Black guibg=Yellow guifg=Black"), - #endif #ifdef FEAT_FOLDING CENT("Folded term=standout ctermbg=DarkGrey ctermfg=Cyan", "Folded term=standout ctermbg=DarkGrey ctermfg=Cyan guibg=DarkGrey guifg=Cyan"), --- 293,300 ---- *** ../vim-9.0.0278/src/popupmenu.c 2022-08-14 14:16:07.999582175 +0100 --- src/popupmenu.c 2022-08-26 16:52:53.194612795 +0100 *************** *** 234,245 **** max_width = pum_base_width; // Calculate column - #ifdef FEAT_WILDMENU if (State == MODE_CMDLINE) // cmdline completion popup menu cursor_col = cmdline_compl_startcol(); else - #endif #ifdef FEAT_RIGHTLEFT if (right_left) cursor_col = curwin->w_wincol + curwin->w_width --- 234,243 ---- *** ../vim-9.0.0278/src/screen.c 2022-08-22 15:19:12.732328943 +0100 --- src/screen.c 2022-08-26 16:53:05.770571328 +0100 *************** *** 876,882 **** } } - #ifdef FEAT_WILDMENU static int skip_status_match_char(expand_T *xp, char_u *s); /* --- 876,881 ---- *************** *** 1144,1150 **** win_redraw_last_status(topframe); vim_free(buf); } - #endif /* * Return TRUE if the status line of window "wp" is connected to the status --- 1143,1148 ---- *** ../vim-9.0.0278/src/version.c 2022-08-26 16:41:10.037072416 +0100 --- src/version.c 2022-08-26 16:57:15.287079345 +0100 *************** *** 656,666 **** # endif #endif "+wildignore", - #ifdef FEAT_WILDMENU "+wildmenu", - #else - "-wildmenu", - #endif "+windows", #ifdef FEAT_WRITEBACKUP "+writebackup", --- 656,662 ---- *** ../vim-9.0.0278/src/globals.h 2022-08-25 16:29:56.838870665 +0100 --- src/globals.h 2022-08-26 16:53:42.266451291 +0100 *************** *** 1341,1353 **** EXTERN char_u langmap_mapchar[256]; // mapping for language keys #endif - #ifdef FEAT_WILDMENU EXTERN int save_p_ls INIT(= -1); // Save 'laststatus' setting EXTERN int save_p_wmh INIT(= -1); // Save 'winminheight' setting EXTERN int wild_menu_showing INIT(= 0); ! # define WM_SHOWN 1 // wildmenu showing ! # define WM_SCROLLED 2 // wildmenu showing with scroll ! #endif #ifdef MSWIN EXTERN char_u toupper_tab[256]; // table for toupper() --- 1341,1351 ---- EXTERN char_u langmap_mapchar[256]; // mapping for language keys #endif EXTERN int save_p_ls INIT(= -1); // Save 'laststatus' setting EXTERN int save_p_wmh INIT(= -1); // Save 'winminheight' setting EXTERN int wild_menu_showing INIT(= 0); ! #define WM_SHOWN 1 // wildmenu showing ! #define WM_SCROLLED 2 // wildmenu showing with scroll #ifdef MSWIN EXTERN char_u toupper_tab[256]; // table for toupper() *** ../vim-9.0.0278/src/option.h 2022-08-26 16:41:10.037072416 +0100 --- src/option.h 2022-08-26 16:53:48.554430653 +0100 *************** *** 1066,1074 **** EXTERN long p_wcm; // 'wildcharm' EXTERN int p_wic; // 'wildignorecase' EXTERN char_u *p_wim; // 'wildmode' - #ifdef FEAT_WILDMENU EXTERN int p_wmnu; // 'wildmenu' - #endif EXTERN long p_wh; // 'winheight' EXTERN long p_wmh; // 'winminheight' EXTERN long p_wmw; // 'winminwidth' --- 1066,1072 ---- *** ../vim-9.0.0278/src/optiondefs.h 2022-08-26 16:41:10.037072416 +0100 --- src/optiondefs.h 2022-08-26 16:53:55.274408598 +0100 *************** *** 2758,2768 **** (char_u *)&p_wic, PV_NONE, {(char_u *)FALSE, (char_u *)0L} SCTX_INIT}, {"wildmenu", "wmnu", P_BOOL|P_VI_DEF, - #ifdef FEAT_WILDMENU (char_u *)&p_wmnu, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif {(char_u *)FALSE, (char_u *)0L} SCTX_INIT}, {"wildmode", "wim", P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP, (char_u *)&p_wim, PV_NONE, --- 2758,2764 ---- *** ../vim-9.0.0278/src/version.c 2022-08-26 16:41:10.037072416 +0100 --- src/version.c 2022-08-26 16:57:15.287079345 +0100 *************** *** 721,722 **** --- 717,720 ---- { /* Add new patch number below this line */ + /**/ + 279, /**/ -- What do you get when you cross a joke with a rehtorical question? /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///