Patch 7.0.214
Problem:    When using <f-args> in a user command it's not possible to have an
            argument end in '\ '.
Solution:   Change the handling of backslashes. (Yakov Lerner)
Files:      runtime/doc/map.txt, src/ex_docmd.c


*** ../vim-7.0.213/runtime/doc/map.txt  Sun May  7 16:57:11 2006
--- runtime/doc/map.txt Thu Mar  8 18:00:26 2007
***************
*** 1,4 ****
! *map.txt*       For Vim version 7.0.  Last change: 2006 May 03
  
  
                  VIM REFERENCE MANUAL    by Bram Moolenaar
--- 1,4 ----
! *map.txt*       For Vim version 7.0.  Last change: 2007 Mar 08
  
  
                  VIM REFERENCE MANUAL    by Bram Moolenaar
***************
*** 1303,1314 ****
  <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.
! 
  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.
  
  Examples >
  
--- 1319,1346 ----
  <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 >
  
*** ../vim-7.0.213/src/ex_docmd.c       Tue Nov 28 21:41:19 2006
--- src/ex_docmd.c      Thu Mar  8 17:49:11 2007
***************
*** 5551,5556 ****
--- 5551,5559 ----
        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,5573 ****
  
      while (*p)
      {
!       if (p[0] == '\\' && vim_iswhite(p[1]))
        {
            len += 1;
            p += 2;
--- 5570,5581 ----
  
      while (*p)
      {
!       if (p[0] == '\\' && p[1] == '\\')
!       {
!           len += 2;
!           p += 2;
!       }
!       else if (p[0] == '\\' && vim_iswhite(p[1]))
        {
            len += 1;
            p += 2;
***************
*** 5603,5609 ****
      *q++ = '"';
      while (*p)
      {
!       if (p[0] == '\\' && vim_iswhite(p[1]))
        {
            *q++ = p[1];
            p += 2;
--- 5611,5623 ----
      *q++ = '"';
      while (*p)
      {
!       if (p[0] == '\\' && p[1] == '\\')
!       {
!           *q++ = '\\';
!           *q++ = '\\';
!           p += 2;
!       }
!       else if (p[0] == '\\' && vim_iswhite(p[1]))
        {
            *q++ = p[1];
            p += 2;
***************
*** 5735,5741 ****
            }
  
            break;
!       case 2: /* Quote and split */
            /* 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);
--- 5749,5755 ----
            }
  
            break;
!       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);
*** ../vim-7.0.213/src/version.c        Thu Mar  8 14:54:52 2007
--- src/version.c       Thu Mar  8 18:11:47 2007
***************
*** 668,669 ****
--- 668,671 ----
  {   /* Add new patch number below this line */
+ /**/
+     214,
  /**/

-- 
Microsoft's definition of a boolean: TRUE, FALSE, MAYBE
"Embrace and extend"...?

 /// Bram Moolenaar -- [EMAIL PROTECTED] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

Reply via email to