diff options
author | Bram Moolenaar <Bram@vim.org> | 2006-03-07 22:38:47 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2006-03-07 22:38:47 +0000 |
commit | 1f35bf9cab16d3f3a63c47894c69c9aa699d8145 (patch) | |
tree | 6484c3e7edc2bcc857cb509b18c5d52d4977db59 /src | |
parent | a203182302733c0ea98d66ee1f576f251697dc81 (diff) | |
download | vim-git-1f35bf9cab16d3f3a63c47894c69c9aa699d8145.tar.gz |
updated for version 7.0217v7.0217
Diffstat (limited to 'src')
-rwxr-xr-x | src/auto/configure | 2 | ||||
-rw-r--r-- | src/configure.in | 2 | ||||
-rw-r--r-- | src/edit.c | 29 | ||||
-rw-r--r-- | src/eval.c | 22 | ||||
-rw-r--r-- | src/ex_cmds.c | 31 | ||||
-rw-r--r-- | src/ex_cmds.h | 16 | ||||
-rw-r--r-- | src/ex_cmds2.c | 9 | ||||
-rw-r--r-- | src/ex_getln.c | 191 | ||||
-rw-r--r-- | src/misc1.c | 5 | ||||
-rw-r--r-- | src/os_amiga.c | 2 | ||||
-rw-r--r-- | src/os_msdos.c | 2 | ||||
-rw-r--r-- | src/popupmenu.c | 7 | ||||
-rw-r--r-- | src/quickfix.c | 16 | ||||
-rw-r--r-- | src/version.h | 4 |
14 files changed, 207 insertions, 131 deletions
diff --git a/src/auto/configure b/src/auto/configure index bad35701c..27c2d6414 100755 --- a/src/auto/configure +++ b/src/auto/configure @@ -2930,7 +2930,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 echo "$as_me:$LINENO: result: not found" >&5 echo "${ECHO_T}not found" >&6 - CFLAGS="save_cflags" + CFLAGS="$save_cflags" echo "$as_me:$LINENO: checking if Intel architecture is supported" >&5 echo $ECHO_N "checking if Intel architecture is supported... $ECHO_C" >&6 CPPFLAGS="$CPPFLAGS -arch i386" diff --git a/src/configure.in b/src/configure.in index 1d622c2aa..60a19ef64 100644 --- a/src/configure.in +++ b/src/configure.in @@ -123,7 +123,7 @@ if test "`(uname) 2>/dev/null`" = Darwin; then AC_MSG_RESULT(found, will make universal binary), AC_MSG_RESULT(not found) - CFLAGS="save_cflags" + CFLAGS="$save_cflags" AC_MSG_CHECKING(if Intel architecture is supported) CPPFLAGS="$CPPFLAGS -arch i386" LDFLAGS="$save_ldflags -arch i386" diff --git a/src/edit.c b/src/edit.c index 3a7a8ced6..2feb8e80f 100644 --- a/src/edit.c +++ b/src/edit.c @@ -111,7 +111,7 @@ static int compl_matches = 0; static char_u *compl_pattern = NULL; static int compl_direction = FORWARD; static int compl_shows_dir = FORWARD; -static int compl_pending = FALSE; +static int compl_pending = 0; /* > 1 for postponed CTRL-N */ static pos_T compl_startpos; static colnr_T compl_col = 0; /* column where the text starts * that is being completed */ @@ -2466,6 +2466,12 @@ ins_compl_show_pum() if (compl == compl_shown_match) { did_find_shown_match = TRUE; + + /* When the original text is the shown match don't set + * compl_shown_match. */ + if (compl->cp_flags & ORIGINAL_TEXT) + shown_match_ok = TRUE; + if (!shown_match_ok && shown_compl != NULL) { /* The shown match isn't displayed, set it to the @@ -3837,14 +3843,14 @@ ins_compl_next(allow_get_expansion, count, insert_match) /* Delete old text to be replaced */ ins_compl_delete(); - compl_pending = FALSE; - /* Repeat this for when <PageUp> or <PageDown> is typed. But don't wrap * around. */ while (--todo >= 0) { if (compl_shows_dir == FORWARD && compl_shown_match->cp_next != NULL) { + if (compl_pending != 0) + --compl_pending; compl_shown_match = compl_shown_match->cp_next; found_end = (compl_first_match != NULL && (compl_shown_match->cp_next == compl_first_match @@ -3853,18 +3859,23 @@ ins_compl_next(allow_get_expansion, count, insert_match) else if (compl_shows_dir == BACKWARD && compl_shown_match->cp_prev != NULL) { + if (compl_pending != 0) + ++compl_pending; found_end = (compl_shown_match == compl_first_match); compl_shown_match = compl_shown_match->cp_prev; found_end |= (compl_shown_match == compl_first_match); } else { - compl_pending = TRUE; + if (compl_shows_dir == BACKWARD) + --compl_pending; + else + ++compl_pending; if (!allow_get_expansion) return -1; num_matches = ins_compl_get_exp(&compl_startpos); - if (compl_pending && compl_direction == compl_shows_dir) + if (compl_pending != 0 && compl_direction == compl_shows_dir) compl_shown_match = compl_curr_match; found_end = FALSE; } @@ -3939,7 +3950,7 @@ ins_compl_next(allow_get_expansion, count, insert_match) /* * Call this while finding completions, to check whether the user has hit a key * that should change the currently displayed completion, or exit completion - * mode. Also, when compl_pending is TRUE, show a completion as soon as + * mode. Also, when compl_pending is not zero, show a completion as soon as * possible. -- webb * "frequency" specifies out of how many calls we actually check. */ @@ -3976,8 +3987,9 @@ ins_compl_check_keys(frequency) else if (c != Ctrl_R) compl_interrupted = TRUE; } - if (compl_pending && !got_int) - (void)ins_compl_next(FALSE, 1, TRUE); + if (compl_pending != 0 && !got_int) + (void)ins_compl_next(FALSE, compl_pending > 0 + ? compl_pending : -compl_pending, TRUE); } /* @@ -4081,6 +4093,7 @@ ins_complete(c) line = ml_get(curwin->w_cursor.lnum); curs_col = curwin->w_cursor.col; + compl_pending = 0; /* if this same ctrl_x_mode has been interrupted use the text from * "compl_startpos" to the cursor as a pattern to add a new word diff --git a/src/eval.c b/src/eval.c index 4336a2633..e5131f32c 100644 --- a/src/eval.c +++ b/src/eval.c @@ -931,7 +931,7 @@ var_redir_start(name, append) else set_var_lval(redir_lval, redir_endp, &tv, TRUE, (char_u *)"="); err = did_emsg; - did_emsg += save_emsg; + did_emsg |= save_emsg; if (err) { var_redir_stop(); @@ -979,7 +979,7 @@ var_redir_str(value, len) did_emsg = FALSE; set_var_lval(redir_lval, redir_endp, &tv, FALSE, (char_u *)"."); err = did_emsg; - did_emsg += save_emsg; + did_emsg |= save_emsg; if (err) var_redir_stop(); @@ -8961,7 +8961,7 @@ filter_map(argvars, rettv, map) int rem; int todo; char_u *msg = map ? (char_u *)"map()" : (char_u *)"filter()"; - int save_called_emsg; + int save_did_emsg; rettv->vval.v_number = 0; if (argvars[0].v_type == VAR_LIST) @@ -8991,11 +8991,10 @@ filter_map(argvars, rettv, map) prepare_vimvar(VV_VAL, &save_val); expr = skipwhite(expr); - /* We reset "called_emsg" to be able to detect whether an error - * occurred during evaluation of the expression. "did_emsg" can't be - * used, because it is reset when calling a function. */ - save_called_emsg = called_emsg; - called_emsg = FALSE; + /* We reset "did_emsg" to be able to detect whether an error + * occurred during evaluation of the expression. */ + save_did_emsg = did_emsg; + did_emsg = FALSE; if (argvars[0].v_type == VAR_DICT) { @@ -9015,7 +9014,7 @@ filter_map(argvars, rettv, map) break; vimvars[VV_KEY].vv_str = vim_strsave(di->di_key); if (filter_map_one(&di->di_tv, expr, map, &rem) == FAIL - || called_emsg) + || did_emsg) break; if (!map && rem) dictitem_remove(d, di); @@ -9034,7 +9033,7 @@ filter_map(argvars, rettv, map) break; nli = li->li_next; if (filter_map_one(&li->li_tv, expr, map, &rem) == FAIL - || called_emsg) + || did_emsg) break; if (!map && rem) listitem_remove(l, li); @@ -9043,7 +9042,7 @@ filter_map(argvars, rettv, map) restore_vimvar(VV_VAL, &save_val); - called_emsg |= save_called_emsg; + did_emsg |= save_did_emsg; } copy_tv(&argvars[0], rettv); @@ -17830,6 +17829,7 @@ ex_function(eap) else eap->skip = TRUE; } + /* An error in a function call during evaluation of an expression in magic * braces should not cause the function not to be defined. */ saved_did_emsg = did_emsg; diff --git a/src/ex_cmds.c b/src/ex_cmds.c index 22bbd45dd..d86084bbd 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -2962,6 +2962,7 @@ do_ecmd(fnum, ffname, sfname, eap, newlnum, flags) int auto_buf = FALSE; /* TRUE if autocommands brought us into the buffer unexpectedly */ char_u *new_name = NULL; + int did_set_swapcommand = FALSE; #endif buf_T *buf; #if defined(FEAT_AUTOCMD) || defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG) @@ -3082,6 +3083,32 @@ do_ecmd(fnum, ffname, sfname, eap, newlnum, flags) reset_VIsual(); #endif +#ifdef FEAT_AUTOCMD + if ((command != NULL || newlnum > (linenr_T)0) + && *get_vim_var_str(VV_SWAPCOMMAND) == NUL) + { + int len; + char_u *p; + + /* Set v:swapcommand for the SwapExists autocommands. */ + if (command != NULL) + len = STRLEN(command) + 3; + else + len = 30; + p = alloc((unsigned)len); + if (p != NULL) + { + if (command != NULL) + vim_snprintf((char *)p, len, ":%s\r", command); + else + vim_snprintf((char *)p, len, "%ldG", (long)newlnum); + set_vim_var_string(VV_SWAPCOMMAND, p, -1); + did_set_swapcommand = TRUE; + vim_free(p); + } + } +#endif + /* * If we are starting to edit another file, open a (new) buffer. * Otherwise we re-use the current buffer. @@ -3619,6 +3646,10 @@ do_ecmd(fnum, ffname, sfname, eap, newlnum, flags) #endif theend: +#ifdef FEAT_AUTOCMD + if (did_set_swapcommand) + set_vim_var_string(VV_SWAPCOMMAND, NULL, -1); +#endif #ifdef FEAT_BROWSE vim_free(browse_file); #endif diff --git a/src/ex_cmds.h b/src/ex_cmds.h index 364803439..476ffa05f 100644 --- a/src/ex_cmds.h +++ b/src/ex_cmds.h @@ -402,9 +402,9 @@ EX(CMD_global, "global", ex_global, EX(CMD_goto, "goto", ex_goto, RANGE|NOTADR|COUNT|TRLBAR|SBOXOK|CMDWIN), EX(CMD_grep, "grep", ex_make, - BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE), + RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE), EX(CMD_grepadd, "grepadd", ex_make, - BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE), + RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE), EX(CMD_gui, "gui", ex_gui, BANG|FILES|EDITCMD|ARGOPT|TRLBAR|CMDWIN), EX(CMD_gvim, "gvim", ex_gui, @@ -514,9 +514,9 @@ EX(CMD_lfirst, "lfirst", ex_cc, EX(CMD_lgetfile, "lgetfile", ex_cfile, TRLBAR|FILE1|BANG), EX(CMD_lgrep, "lgrep", ex_make, - BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE), + RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE), EX(CMD_lgrepadd, "lgrepadd", ex_make, - BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE), + RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE), EX(CMD_lhelpgrep, "lhelpgrep", ex_helpgrep, EXTRA|NOTRLCOM|NEEDARG), EX(CMD_ll, "ll", ex_cc, @@ -562,9 +562,9 @@ EX(CMD_ltag, "ltag", ex_tag, EX(CMD_lunmap, "lunmap", ex_unmap, EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), EX(CMD_lvimgrep, "lvimgrep", ex_vimgrep, - BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE), + RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE), EX(CMD_lvimgrepadd, "lvimgrepadd", ex_vimgrep, - BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE), + RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE), EX(CMD_lwindow, "lwindow", ex_cwindow, RANGE|NOTADR|COUNT|TRLBAR), EX(CMD_ls, "ls", buflist_list, @@ -974,9 +974,9 @@ EX(CMD_visual, "visual", ex_edit, EX(CMD_view, "view", ex_edit, BANG|FILE1|EDITCMD|ARGOPT|TRLBAR), EX(CMD_vimgrep, "vimgrep", ex_vimgrep, - BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE), + RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE), EX(CMD_vimgrepadd, "vimgrepadd", ex_vimgrep, - BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE), + RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE), EX(CMD_viusage, "viusage", ex_viusage, TRLBAR), EX(CMD_vmap, "vmap", ex_map, diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c index 7d6a0eb6e..00dcea9eb 100644 --- a/src/ex_cmds2.c +++ b/src/ex_cmds2.c @@ -2612,9 +2612,10 @@ cmd_source(fname, eap) if (*fname == NUL) EMSG(_(e_argreq)); - /* ":source!" read vi commands */ else if (eap != NULL && eap->forceit) - /* Need to execute the commands directly when: + /* ":source!": read Normal mdoe commands + * Need to execute the commands directly. This is required at least + * for: * - ":g" command busy * - after ":argdo", ":windo" or ":bufdo" * - another command follows @@ -2768,6 +2769,10 @@ do_source(fname, check_other, is_vimrc) goto theend; } +#ifdef FEAT_AUTOCMD + apply_autocmds(EVENT_SOURCEPRE, fname_exp, fname_exp, FALSE, curbuf); +#endif + #if defined(WIN32) && defined(FEAT_CSCOPE) cookie.fp = fopen_noinh_readbin((char *)fname_exp); #else diff --git a/src/ex_getln.c b/src/ex_getln.c index 4b7a58438..832861907 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -103,6 +103,7 @@ static void set_expand_context __ARGS((expand_T *xp)); static int ExpandFromContext __ARGS((expand_T *xp, char_u *, int *, char_u ***, int)); static int expand_showtail __ARGS((expand_T *xp)); #ifdef FEAT_CMDL_COMPL +static int expand_shellcmd __ARGS((char_u *filepat, int *num_file, char_u ***file, int flagsarg)); static int ExpandRTDir __ARGS((char_u *pat, int *num_file, char_u ***file, char *dirname)); # if defined(FEAT_USR_CMDS) && defined(FEAT_EVAL) static int ExpandUserDefined __ARGS((expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file)); @@ -4180,93 +4181,6 @@ ExpandFromContext(xp, pat, num_file, file, options) return ret; } - if (xp->xp_context == EXPAND_SHELLCMD) - { - /* - * Expand shell command. - */ - int i; - char_u *path; - int mustfree = FALSE; - garray_T ga; - char_u *buf = alloc(MAXPATHL); - int l; - char_u *s, *e; - - if (buf == NULL) - return FAIL; - - /* for ":set path=" and ":set tags=" halve backslashes for escaped - * space */ - pat = vim_strsave(pat); - for (i = 0; pat[i]; ++i) - if (pat[i] == '\\' && pat[i + 1] == ' ') - STRCPY(pat + i, pat + i + 1); - - flags |= EW_FILE | EW_EXEC; - /* For an absolute name we don't use $PATH. */ - if ((pat[0] == '.' && (vim_ispathsep(pat[1]) - || (pat[1] == '.' && vim_ispathsep(pat[2]))))) - path = (char_u *)"."; - else - path = vim_getenv((char_u *)"PATH", &mustfree); - - ga_init2(&ga, (int)sizeof(char *), 10); - for (s = path; *s != NUL; s = e) - { -#if defined(MSDOS) || defined(MSWIN) || defined(OS2) - e = vim_strchr(s, ';'); -#else - e = vim_strchr(s, ':'); -#endif - if (e == NULL) - e = s + STRLEN(s); - - l = e - s; - if (l > MAXPATHL - 5) - break; - vim_strncpy(buf, s, l); - add_pathsep(buf); - l = STRLEN(buf); - vim_strncpy(buf + l, pat, MAXPATHL - 1 - l); - - /* Expand matches in one directory of $PATH. */ - ret = expand_wildcards(1, &buf, num_file, file, flags); - if (ret == OK) - { - if (ga_grow(&ga, *num_file) == FAIL) - FreeWild(*num_file, *file); - else - { - for (i = 0; i < *num_file; ++i) - { - s = (*file)[i]; - if (STRLEN(s) > l) - { - /* Remove the path again. */ - mch_memmove(s, s + l, STRLEN(s + l) + 1); - ((char_u **)ga.ga_data)[ga.ga_len] = s; - ++ga.ga_len; - } - else - vim_free(s); - } - vim_free(*file); - } - } - if (*e != NUL) - ++e; - } - *file = ga.ga_data; - *num_file = ga.ga_len; - - vim_free(buf); - vim_free(pat); - if (mustfree) - vim_free(path); - return ret; - } - *file = (char_u **)""; *num_file = 0; if (xp->xp_context == EXPAND_HELP) @@ -4284,6 +4198,8 @@ ExpandFromContext(xp, pat, num_file, file, options) #ifndef FEAT_CMDL_COMPL return FAIL; #else + if (xp->xp_context == EXPAND_SHELLCMD) + return expand_shellcmd(pat, num_file, file, flags); if (xp->xp_context == EXPAND_OLD_SETTING) return ExpandOldSetting(num_file, file); if (xp->xp_context == EXPAND_BUFFERS) @@ -4457,6 +4373,107 @@ ExpandGeneric(xp, regmatch, num_file, file, func) return OK; } +/* + * Complete a shell command. + * Returns FAIL or OK; + */ + static int +expand_shellcmd(filepat, num_file, file, flagsarg) + char_u *filepat; /* pattern to match with command names */ + int *num_file; /* return: number of matches */ + char_u ***file; /* return: array with matches */ + int flagsarg; /* EW_ flags */ +{ + char_u *pat; + int i; + char_u *path; + int mustfree = FALSE; + garray_T ga; + char_u *buf = alloc(MAXPATHL); + size_t l; + char_u *s, *e; + int flags = flagsarg; + int ret; + + if (buf == NULL) + return FAIL; + + /* for ":set path=" and ":set tags=" halve backslashes for escaped + * space */ + pat = vim_strsave(filepat); + for (i = 0; pat[i]; ++i) + if (pat[i] == '\\' && pat[i + 1] == ' ') + STRCPY(pat + i, pat + i + 1); + + flags |= EW_FILE | EW_EXEC; + + /* For an absolute name we don't use $PATH. */ + if ((pat[0] == '.' && (vim_ispathsep(pat[1]) + || (pat[1] == '.' && vim_ispathsep(pat[2]))))) + path = (char_u *)"."; + else + path = vim_getenv((char_u *)"PATH", &mustfree); + + /* + * Go over all directories in $PATH. Expand matches in that directory and + * collect them in "ga". + */ + ga_init2(&ga, (int)sizeof(char *), 10); + for (s = path; *s != NUL; s = e) + { +#if defined(MSDOS) || defined(MSWIN) || defined(OS2) + e = vim_strchr(s, ';'); +#else + e = vim_strchr(s, ':'); +#endif + if (e == NULL) + e = s + STRLEN(s); + + l = e - s; + if (l > MAXPATHL - 5) + break; + vim_strncpy(buf, s, l); + add_pathsep(buf); + l = STRLEN(buf); + vim_strncpy(buf + l, pat, MAXPATHL - 1 - l); + + /* Expand matches in one directory of $PATH. */ + ret = expand_wildcards(1, &buf, num_file, file, flags); + if (ret == OK) + { + if (ga_grow(&ga, *num_file) == FAIL) + FreeWild(*num_file, *file); + else + { + for (i = 0; i < *num_file; ++i) + { + s = (*file)[i]; + if (STRLEN(s) > l) + { + /* Remove the path again. */ + mch_memmove(s, s + l, STRLEN(s + l) + 1); + ((char_u **)ga.ga_data)[ga.ga_len++] = s; + } + else + vim_free(s); + } + vim_free(*file); + } + } + if (*e != NUL) + ++e; + } + *file = ga.ga_data; + *num_file = ga.ga_len; + + vim_free(buf); + vim_free(pat); + if (mustfree) + vim_free(path); + return OK; +} + + # if defined(FEAT_USR_CMDS) && defined(FEAT_EVAL) static void * call_user_expand_func __ARGS((void *(*user_expand_func) __ARGS((char_u *, int, char_u **, int)), expand_T *xp, int *num_file, char_u ***file)); diff --git a/src/misc1.c b/src/misc1.c index f95d93d49..83995356f 100644 --- a/src/misc1.c +++ b/src/misc1.c @@ -8938,6 +8938,7 @@ expand_backtick(gap, pat, flags) * Add a file to a file list. Accepted flags: * EW_DIR add directories * EW_FILE add files + * EW_EXEC add executable files * EW_NOTFOUND add even when it doesn't exist * EW_ADDSLASH add slash after directory name */ @@ -8964,6 +8965,10 @@ addfile(gap, f, flags) if ((isdir && !(flags & EW_DIR)) || (!isdir && !(flags & EW_FILE))) return; + /* If the file isn't executable, may not add it. Do accept directories. */ + if (!isdir && (flags & EW_EXEC) && !mch_can_exe(f)) + return; + /* Make room for another item in the file list. */ if (ga_grow(gap, 1) == FAIL) return; diff --git a/src/os_amiga.c b/src/os_amiga.c index 17e071e75..37c5c9401 100644 --- a/src/os_amiga.c +++ b/src/os_amiga.c @@ -810,7 +810,6 @@ mch_mkdir(name) UnLock(lock); } -#if defined(FEAT_EVAL) || defined(PROTO) /* * Return 1 if "name" can be executed, 0 if not. * Return -1 if unknown. @@ -822,7 +821,6 @@ mch_can_exe(name) /* TODO */ return -1; } -#endif /* * Check what "name" is: diff --git a/src/os_msdos.c b/src/os_msdos.c index 4563bf18c..84341edf0 100644 --- a/src/os_msdos.c +++ b/src/os_msdos.c @@ -2938,7 +2938,6 @@ mch_isdir(char_u *name) return TRUE; } -#if defined(FEAT_EVAL) || defined(PROTO) /* * Return 1 if "name" can be executed, 0 if not. * Return -1 if unknown. @@ -2954,7 +2953,6 @@ mch_can_exe(name) return FALSE; return TRUE; } -#endif /* * Check what "name" is: diff --git a/src/popupmenu.c b/src/popupmenu.c index 9d11a4570..ffc9dd0ea 100644 --- a/src/popupmenu.c +++ b/src/popupmenu.c @@ -40,7 +40,8 @@ static int pum_col; /* left column of pum */ pum_display(array, size, selected, row, height, col) pumitem_T *array; int size; - int selected; /* index of initially selected item */ + int selected; /* index of initially selected item, none if + out of range */ int row; int height; int col; @@ -256,7 +257,7 @@ pum_get_selected() /* * Set the index of the currently selected item. The menu will scroll when - * necessary. + * necessary. When "n" is out of range don't scroll. */ void pum_set_selected(n) @@ -264,7 +265,7 @@ pum_set_selected(n) { pum_selected = n; - if (pum_selected >= 0) + if (pum_selected >= 0 && pum_selected < pum_size) { if (pum_first > pum_selected - 4) { diff --git a/src/quickfix.c b/src/quickfix.c index bc4ef1c6a..1431c76a4 100644 --- a/src/quickfix.c +++ b/src/quickfix.c @@ -2905,6 +2905,7 @@ ex_vimgrep(eap) char_u *au_name = NULL; int flags = 0; colnr_T col; + long tomatch; switch (eap->cmdidx) { @@ -2933,6 +2934,11 @@ ex_vimgrep(eap) return; } + if (eap->addr_count > 0) + tomatch = eap->line2; + else + tomatch = MAXLNUM; + /* Get the search pattern: either white-separated or enclosed in // */ regmatch.regprog = NULL; p = skip_vimgrep_pat(eap->arg, &s, &flags); @@ -2975,7 +2981,7 @@ ex_vimgrep(eap) } seconds = (time_t)0; - for (fi = 0; fi < fcount && !got_int; ++fi) + for (fi = 0; fi < fcount && !got_int && tomatch > 0; ++fi) { if (time(NULL) > seconds) { @@ -3035,7 +3041,8 @@ ex_vimgrep(eap) { found_match = FALSE; /* Try for a match in all lines of the buffer. */ - for (lnum = 1; lnum <= buf->b_ml.ml_line_count; ++lnum) + for (lnum = 1; lnum <= buf->b_ml.ml_line_count && tomatch > 0; + ++lnum) { /* For ":1vimgrep" look for multiple matches. */ col = 0; @@ -3059,8 +3066,9 @@ ex_vimgrep(eap) got_int = TRUE; break; } - else - found_match = TRUE; + found_match = TRUE; + if (--tomatch == 0) + break; if ((flags & VGR_GLOBAL) == 0 || regmatch.endpos[0].lnum > 0) break; diff --git a/src/version.h b/src/version.h index 134e8f5b9..9f2cbcc09 100644 --- a/src/version.h +++ b/src/version.h @@ -36,5 +36,5 @@ #define VIM_VERSION_NODOT "vim70aa" #define VIM_VERSION_SHORT "7.0aa" #define VIM_VERSION_MEDIUM "7.0aa ALPHA" -#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2006 Mar 6)" -#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2006 Mar 6, compiled " +#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2006 Mar 7)" +#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2006 Mar 7, compiled " |