Am 16.02.2012 05:54, schrieb Bram Moolenaar:
Ben Fritz wrote:

I think we should do the auto-escaping, with shellxquote=(, and
additionally add a help note by :! and system() that "According to
the Microsoft documentation for cmd.exe, you either need to escape
(with a ^ character) any of these characters appearing literally in
your command, or surround them in quotes ("):>  ( ) @ ^ |." Should we
mention that Vim will escape them again, and also escape "?

Yes, I think the user should escape&  and | when they appear in a
command.  I haven't verified, but I believe they are illegal in a file
name.

`|' is illegal in a file name, but `&' is not.


Characters with special meaning [1]:          " < > | & ( ) @ ^
Characters that can't be used in file names:  " < > | * ?
Characters to be escaped [2] in a file name:  Space & ( ) @ ^

[1] Vim should escape these with `^'
[2] prepend `^' or enclose file name in quotes


Please try the patch below.  I currently do not have a Windows machine
to try this out.

Does the patch escape special characters?  I can't see code for it.
Again, suggested settings are:
    shellcmdflag: /c
    shellxquote: (
    escape special characters with `^'


IMHO  shellxquote = '"('  should not be supported, it was an
intermediate solution with its own problems.


*** ../vim-7.3.444/src/misc2.c  2012-01-20 17:15:47.000000000 +0100
--- src/misc2.c 2012-02-16 05:34:37.000000000 +0100
***************
*** 3230,3236 ****
            {
                STRCPY(ncmd, p_sxq);
                STRCAT(ncmd, cmd);
!               STRCAT(ncmd, p_sxq);
                retval = mch_call_shell(ncmd, opt);
                vim_free(ncmd);
            }
--- 3230,3240 ----
            {
                STRCPY(ncmd, p_sxq);
                STRCAT(ncmd, cmd);
!               /* When 'shellxquote' is ( append ).
!                * When 'shellxquote' is "( append )". */
!               STRCAT(ncmd, STRCMP(p_sxq, "(") == 0 ? (char_u *)")"
!                          : STRCMP(p_sxq, "\"(") == 0 ? (char_u *)")\""
!                          : p_sxq);
                retval = mch_call_shell(ncmd, opt);
                vim_free(ncmd);
            }
*** ../vim-7.3.444/src/option.c 2012-02-12 23:23:25.000000000 +0100
--- src/option.c        2012-02-16 05:31:12.000000000 +0100
***************
*** 3935,3949 ****
         *
         * To avoid this, use the /s argument in addition to /c to force the
         * stripping behavior, and also set shellxquote to automatically
!        * surround the entire command in quotes (which get stripped as
!        * noted).
         */

        /* Set shellxquote default to add the quotes to be stripped. */
        idx3 = findoption((char_u *)"sxq");
        if (idx3>= 0&&  !(options[idx3].flags&  P_WAS_SET))
        {
!           p_sxq = (char_u *)"\"";
            options[idx3].def_val[VI_DEFAULT] = p_sxq;
        }

--- 3935,3949 ----
         *
         * To avoid this, use the /s argument in addition to /c to force the
         * stripping behavior, and also set shellxquote to automatically
!        * surround the entire command in "(cmd)" (the double quotes get
!        * stripped as noted).
         */

        /* Set shellxquote default to add the quotes to be stripped. */
        idx3 = findoption((char_u *)"sxq");
        if (idx3>= 0&&  !(options[idx3].flags&  P_WAS_SET))
        {
!           p_sxq = (char_u *)"\"(";
            options[idx3].def_val[VI_DEFAULT] = p_sxq;
        }

*** ../vim-7.3.444/src/os_win32.c       2011-08-27 15:10:00.000000000 +0200
--- src/os_win32.c      2012-02-16 05:47:36.000000000 +0100
***************
*** 3908,3915 ****
        newcmd = lalloc(cmdlen, TRUE);
        if (newcmd != NULL)
        {
!           char_u *cmdbase = (*cmd == '"' ? cmd + 1 : cmd);

            if ((STRNICMP(cmdbase, "start", 5) == 0)&&  vim_iswhite(cmdbase[5]))
            {
                STARTUPINFO             si;
--- 3908,3920 ----
        newcmd = lalloc(cmdlen, TRUE);
        if (newcmd != NULL)
        {
!           char_u *cmdbase = cmd;

+           /* Skip a leading ", ( and "(. */
+           if (*cmdbase == '"' )
+               ++cmdbase;
+           if (*cmdbase == '(')
+               ++cmdbase;
            if ((STRNICMP(cmdbase, "start", 5) == 0)&&  vim_iswhite(cmdbase[5]))
            {
                STARTUPINFO             si;
***************
*** 3953,3968 ****
                 * empty, keep the double quotes around the command.
                 * Otherwise remove the double quotes, they aren't needed
                 * here, because we don't use a shell to run the command. */
!               if (*cmd == '"'&&  *p_sxq == NUL)
                {
!                   newcmd[0] = '"';
!                   STRCPY(newcmd + 1, cmdbase);
!               }
!               else
!               {
!                   STRCPY(newcmd, cmdbase);
!                   if (*cmd == '"'&&  *newcmd != NUL)
!                       newcmd[STRLEN(newcmd) - 1] = NUL;
                }

                /*
--- 3958,3983 ----
                 * empty, keep the double quotes around the command.
                 * Otherwise remove the double quotes, they aren't needed
                 * here, because we don't use a shell to run the command. */
!               if (cmdbase>  cmd)
                {
!                   if (STRNCMP(cmd, p_sxq, cmd - cmdbase) != 0)
!                   {
!                       STRCPY(newcmd, cmd);
!                   }
!                   else
!                   {
!                       char_u *p;
!
!                       STRCPY(newcmd, cmdbase);
!                       /* Remove a trailing ", ) and )" if they have a match
!                        * at the start of the command. */
!                       p = newcmd + STRLEN(newcmd);
!                       if (p>  newcmd&&  p[-1] == '"'&&  *cmd == '"')
!                           *--p = NUL;
!                       if (p>  newcmd&&  p[-1] == ')'
!                                       &&  (*cmd =='(' || cmd[1] == '('))
!                           *--p = NUL;
!                   }
                }

                /*

--
Andy

--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

Raspunde prin e-mail lui