summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2006-03-07 22:38:47 +0000
committerBram Moolenaar <Bram@vim.org>2006-03-07 22:38:47 +0000
commit1f35bf9cab16d3f3a63c47894c69c9aa699d8145 (patch)
tree6484c3e7edc2bcc857cb509b18c5d52d4977db59 /src
parenta203182302733c0ea98d66ee1f576f251697dc81 (diff)
downloadvim-git-1f35bf9cab16d3f3a63c47894c69c9aa699d8145.tar.gz
updated for version 7.0217v7.0217
Diffstat (limited to 'src')
-rwxr-xr-xsrc/auto/configure2
-rw-r--r--src/configure.in2
-rw-r--r--src/edit.c29
-rw-r--r--src/eval.c22
-rw-r--r--src/ex_cmds.c31
-rw-r--r--src/ex_cmds.h16
-rw-r--r--src/ex_cmds2.c9
-rw-r--r--src/ex_getln.c191
-rw-r--r--src/misc1.c5
-rw-r--r--src/os_amiga.c2
-rw-r--r--src/os_msdos.c2
-rw-r--r--src/popupmenu.c7
-rw-r--r--src/quickfix.c16
-rw-r--r--src/version.h4
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 "