changeset 1088:c3ba2dcc4cf4 v7.0.214

updated for version 7.0-214
author vimboss
date Thu, 08 Mar 2007 17:12:08 +0000
parents c94bbf85eb16
children 965805580982
files runtime/doc/map.txt src/ex_docmd.c src/version.c
diffstat 3 files changed, 37 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/map.txt
+++ b/runtime/doc/map.txt
@@ -1,4 +1,4 @@
-*map.txt*       For Vim version 7.0.  Last change: 2006 May 03
+*map.txt*       For Vim version 7.0.  Last change: 2007 Mar 08
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -1303,12 +1303,28 @@ If the first two characters of an escape
 <q-args>) then the value is quoted in such a way as to make it a valid value
 for use in an expression.  This uses the argument as one single value.
 When there is no argument <q-args> is an empty string.
-
+							*<f-args>*
 To allow commands to pass their arguments on to a user-defined function, there
 is a special form <f-args> ("function args").  This splits the command
 arguments at spaces and Tabs, quotes each argument individually, and the
 <f-args> sequence is replaced by the comma-separated list of quoted arguments.
 See the Mycmd example below.  If no arguments are given <f-args> is removed.
+   To embed whitespace into an argument of <f-args>, prepend a backslash.
+<f-args> replaces every pair of backslashes (\\) with one backslash.  A
+backslash followed by a character other than white space or a backslash
+remains unmodified.  Overview:
+
+	command		   <f-args> ~
+	XX ab		   'ab'
+	XX a\b		   'a\b'
+	XX a\ b		   'a b'
+	XX a\  b	   'a ', 'b'
+	XX a\\b		   'a\b'
+	XX a\\ b	   'a\', 'b'
+	XX a\\\b	   'a\\b'
+	XX a\\\ b	   'a\ b'
+	XX a\\\\b	   'a\\b'
+	XX a\\\\ b	   'a\\', 'b'
 
 Examples >
 
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -5551,6 +5551,9 @@ ex_delcommand(eap)
 	mch_memmove(cmd, cmd + 1, (gap->ga_len - i) * sizeof(ucmd_T));
 }
 
+/*
+ * split and quote args for <f-args>
+ */
     static char_u *
 uc_split_args(arg, lenp)
     char_u *arg;
@@ -5567,7 +5570,12 @@ uc_split_args(arg, lenp)
 
     while (*p)
     {
-	if (p[0] == '\\' && vim_iswhite(p[1]))
+	if (p[0] == '\\' && p[1] == '\\')
+	{
+	    len += 2;
+	    p += 2;
+	}
+	else if (p[0] == '\\' && vim_iswhite(p[1]))
 	{
 	    len += 1;
 	    p += 2;
@@ -5603,7 +5611,13 @@ uc_split_args(arg, lenp)
     *q++ = '"';
     while (*p)
     {
-	if (p[0] == '\\' && vim_iswhite(p[1]))
+	if (p[0] == '\\' && p[1] == '\\')
+	{
+	    *q++ = '\\';
+	    *q++ = '\\';
+	    p += 2;
+	}
+	else if (p[0] == '\\' && vim_iswhite(p[1]))
 	{
 	    *q++ = p[1];
 	    p += 2;
@@ -5735,7 +5749,7 @@ uc_check_code(code, len, buf, cmd, eap, 
 	    }
 
 	    break;
-	case 2: /* Quote and split */
+	case 2: /* Quote and split (<f-args>) */
 	    /* This is hard, so only do it once, and cache the result */
 	    if (*split_buf == NULL)
 		*split_buf = uc_split_args(eap->arg, split_len);
--- 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 */
 /**/
+    214,
+/**/
     213,
 /**/
     212,