changeset 1098:5a1d8468d1fa v7.0.224

updated for version 7.0-224
author vimboss
date Tue, 27 Mar 2007 14:57:09 +0000
parents 537cb92935b6
children 2ec8266fa254
files src/eval.c src/ex_docmd.c src/proto/ex_docmd.pro src/version.c
diffstat 4 files changed, 24 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/eval.c
+++ b/src/eval.c
@@ -8924,7 +8924,7 @@ f_expand(argvars, rettv)
     if (*s == '%' || *s == '#' || *s == '<')
     {
 	++emsg_off;
-	rettv->vval.v_string = eval_vars(s, &len, NULL, &errormsg, s);
+	rettv->vval.v_string = eval_vars(s, s, &len, NULL, &errormsg, NULL);
 	--emsg_off;
     }
     else
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -4176,6 +4176,7 @@ expand_filename(eap, cmdlinep, errormsgp
     int		srclen;
     char_u	*p;
     int		n;
+    int		escaped;
 
 #ifdef FEAT_QUICKFIX
     /* Skip a regexp pattern for ":vimgrep[add] pat file..." */
@@ -4216,7 +4217,8 @@ expand_filename(eap, cmdlinep, errormsgp
 	/*
 	 * Try to find a match at this position.
 	 */
-	repl = eval_vars(p, &srclen, &(eap->do_ecmd_lnum), errormsgp, eap->arg);
+	repl = eval_vars(p, eap->arg, &srclen, &(eap->do_ecmd_lnum),
+							 errormsgp, &escaped);
 	if (*errormsgp != NULL)		/* error detected */
 	    return FAIL;
 	if (repl == NULL)		/* no match found */
@@ -4235,11 +4237,15 @@ expand_filename(eap, cmdlinep, errormsgp
 	    vim_free(l);
 	}
 
-	/* Need to escape white space et al. with a backslash.  Don't do this
-	 * for shell commands (may have to use quotes instead).  Don't do this
-	 * for non-unix systems when there is a single argument (spaces don't
-	 * separate arguments then). */
+	/* Need to escape white space et al. with a backslash.
+	 * Don't do this for:
+	 * - replacement that already has been escaped: "##"
+	 * - shell commands (may have to use quotes instead).
+	 * - non-unix systems when there is a single argument (spaces don't
+	 *   separate arguments then).
+	 */
 	if (!eap->usefilter
+		&& !escaped
 		&& eap->cmdidx != CMD_bang
 		&& eap->cmdidx != CMD_make
 		&& eap->cmdidx != CMD_lmake
@@ -9280,12 +9286,14 @@ ex_tag_cmd(eap, name)
  * number of characters to skip.
  */
     char_u *
-eval_vars(src, usedlen, lnump, errormsg, srcstart)
+eval_vars(src, srcstart, usedlen, lnump, errormsg, escaped)
     char_u	*src;		/* pointer into commandline */
+    char_u	*srcstart;	/* beginning of valid memory for src */
     int		*usedlen;	/* characters after src that are used */
     linenr_T	*lnump;		/* line number for :e command, or NULL */
     char_u	**errormsg;	/* pointer to error message */
-    char_u	*srcstart;	/* beginning of valid memory for src */
+    int		*escaped;	/* return value has escaped white space (can
+				 * be NULL) */
 {
     int		i;
     char_u	*s;
@@ -9332,6 +9340,8 @@ eval_vars(src, usedlen, lnump, errormsg,
 #endif
 
     *errormsg = NULL;
+    if (escaped != NULL)
+	*escaped = FALSE;
 
     /*
      * Check if there is something to do.
@@ -9407,6 +9417,8 @@ eval_vars(src, usedlen, lnump, errormsg,
 		    result = arg_all();
 		    resultbuf = result;
 		    *usedlen = 2;
+		    if (escaped != NULL)
+			*escaped = TRUE;
 #ifdef FEAT_MODIFY_FNAME
 		    skip_mod = TRUE;
 #endif
@@ -9627,7 +9639,7 @@ expand_sfile(arg)
 	else
 	{
 	    /* replace "<sfile>" with the sourced file name, and do ":" stuff */
-	    repl = eval_vars(p, &srclen, NULL, &errormsg, result);
+	    repl = eval_vars(p, result, &srclen, NULL, &errormsg, NULL);
 	    if (errormsg != NULL)
 	    {
 		if (*errormsg)
--- a/src/proto/ex_docmd.pro
+++ b/src/proto/ex_docmd.pro
@@ -44,7 +44,7 @@ extern int vim_mkdir_emsg __ARGS((char_u
 extern FILE *open_exfile __ARGS((char_u *fname, int forceit, char *mode));
 extern void update_topline_cursor __ARGS((void));
 extern void exec_normal_cmd __ARGS((char_u *cmd, int remap, int silent));
-extern char_u *eval_vars __ARGS((char_u *src, int *usedlen, linenr_T *lnump, char_u **errormsg, char_u *srcstart));
+extern char_u *eval_vars __ARGS((char_u *src, char_u *srcstart, int *usedlen, linenr_T *lnump, char_u **errormsg, int *escaped));
 extern char_u *expand_sfile __ARGS((char_u *arg));
 extern int put_eol __ARGS((FILE *fd));
 extern int put_line __ARGS((FILE *fd, char *s));
--- a/src/version.c
+++ b/src/version.c
@@ -667,6 +667,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    224,
+/**/
     223,
 /**/
     222,