diff options
-rw-r--r-- | runtime/doc/map.txt | 20 | ||||
-rw-r--r-- | src/ex_docmd.c | 20 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 37 insertions, 5 deletions
diff --git a/runtime/doc/map.txt b/runtime/doc/map.txt index 62515cc615..d81bc3f010 100644 --- 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 sequence are "q-" (for example, <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 > diff --git a/src/ex_docmd.c b/src/ex_docmd.c index 7f136f19a7..1152a18a73 100644 --- 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, split_buf, split_len) } 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); diff --git a/src/version.c b/src/version.c index f8593316f6..6c4c641f10 100644 --- 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, |