I've been playing around with a plugin
(http://www.vim.org/scripts/script.php?script_id=2378), trying to
specify a path to the _command_ that is passed to system(). Since this
command may have spaces in it, it needs to be wrapped in quotes.

However, if it is wrapped in quotes, the default settings of
shellxquote on win32 do not work. This command will not do what is
intended, for example:

cmd /c "C:\some path\some program.exe" "an argument"

If you set shellxquote to \" it does work. The command passed looks
funny, but is actually desired:

cmd /c ""C:\some path\some program.exe" "an argument""

I think that shellxquote should default to \" on Windows always. I
know of no case where it fails.

The reason for this behavior:

>From the help for cmd in Windows:

> If /C or /K is specified, then the remainder of the command line after
> the switch is processed as a command line, where the following logic is
> used to process quote (") characters:
>
>     1.  If all of the following conditions are met, then quote characters
>         on the command line are preserved:
>
>         - no /S switch
>         - exactly two quote characters
>         - no special characters between the two quote characters,
>           where special is one of: &<>()@^|
>         - there are one or more whitespace characters between the
>           the two quote characters
>         - the string between the two quote characters is the name
>           of an executable file.
>
>     2.  Otherwise, old behavior is to see if the first character is
>         a quote character and if so, strip the leading character and
>         remove the last quote character on the command line, preserving
>         any text after the last quote character."

Both values of shellxquote, in this case, will fall into category 2.

Thus, the current default actually executes the command:

C:\some path\some program.exe" "an argument

Whereas, setting shellxquote to \" will execute:

"C:\some path\some program.exe" "an argument"

This is the desired command.

Normal commands would still work, for example, the command:

echo "abc def"

becomes:

cmd /c "echo "abc def""

which executes:

echo "abc def"

Again, just as desired.

This might not always work, because I think some versions of cmd.exe
will strip the _closing_ quote instead of the _last_ quote. For the
best possible compatibility, it is probably a good idea to also
default shellcmdflag to "/s\ /c" instead of just "/c" in the same
situation that "/c" currently applies. This will force the 2nd quote
behavior given in the quoted cmd help.

--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

Raspunde prin e-mail lui