当路径在Windows上有空格时,如何从vim脚本运行!<cmd>?</cmd>

时间:2011-11-14 16:59:20

标签: vim

我正在尝试在vim中使用:!<cmd>格式来执行外部命令并将结果放入缓冲区。如果我键入:!,则可以完成路径,并且我可以完成路径,直到我想要执行的命令。这会自动转义空格,如下所示:

:!c:\Program\ Files\ (x86)\Microsoft\ Visual\ Studio\ 9.0\Common7\IDE\TF.exe

当我点击进入时,我得到:

'c:\Program\' is not recognized as an internal or external command

我怀疑这意味着在将命令传递给cmd.exe时vim没有正确转义空格。我已经尝试过各种各样的逃避组合来完成这项工作,但无济于事。我发现这样做的唯一方法是弄清楚DOS8.3文件名是什么,并使用它而不是长路径名。但是,我不喜欢这种方法,因为它会使我的脚本不那么便携。有谁知道这是否可以做到,还是vim中的错误?

4 个答案:

答案 0 :(得分:3)

用双引号括起可执行文件的完整路径名。不要转义路径名中的空格。

在您的示例中,一些反斜杠已添加到转义空间,而其他反转则是路径名的一部分。你没有提供原始路径名,但我可以猜到它。如果我猜对了,那么可行的命令就是:

:!"c:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\TF.exe"

这在脚本中同样有效。等效的脚本命令是:

silent execute '!"c:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\TF.exe"'

我在Vim 7.3.346 x86中进行了测试,安装在Windows 7 Pro SP1 x64上。

答案 1 :(得分:3)

如果你有引用的参数,而不仅仅是exe路径,那么你可能需要做一些花哨的引用,如下所示。主要问题不是exe路径本身,而是参数。我发现这个网页对我自己的类似问题很有帮助: http://blogs.msdn.com/b/twistylittlepassagesallalike/archive/2011/04/23/everyone-quotes-arguments-the-wrong-way.aspx

不确定并且没有时间检查,但如果您有引用的参数,那么下面的示例可能更接近您的需求:

silent! exe 'r!"C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\TF.exe" history /followbranches \^"#\^"' 

另外,我想知道路径周围的引号是否需要特殊处理,因为它们只是完整命令的一部分。在任何情况下,引号\^"适用于命令行中的主引号,^"适用于嵌入其他引号中的引号。我过去发现在Windows提示符下试验该命令很有用,记得按照Vim准备它的方式测试它,这是c:\windows\sys32\cmd.exe前面的命令。

第二个想法,我认为当我处理类似的问题时,我从未尝试过使用引用的参数解决命令,并在同一命令中引用了exe-path-with-spaces。我希望有办法做到这一点,但我只是在没有空格的路径中创建了一个到exe的软链接。 E.g:

 mklink c:\users\myname\myexe c:\program files(x86)\myapp\myexe.exe

完成后,不需要引用exe命令本身,引用\^"的参数工作正常。我当然很好奇如何引用一个引用了参数的exe-with-spaces

编辑:我认为我通过引用找到了解决问题的方法,没有VS用您的确切命令进行测试,但是我认为这可以从命令行开始:

cmd /k ""C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\TF.exe" history /followbranches ^"#^""

如果从命令行对你有用,那么我认为唯一的问题就是让Vim包含/ k开关。 (另外,Windows命令行可能会出现“抛弃”/ followbranch开关的问题,因为正斜杠,但可能没有。)

EDIT2:我认为从Vim做这件事的诀窍就是把'cmd / k'作为你正在运行的命令的一部分。你最终打开了几个级别的炮弹,但我不认为这是一个问题。举个例子,这里是从Vim运行的,在exe路径中有(1)个空格,(2)引用的参数((message .. ))和偶数(3)引用的参数中的引用(\^"hi\^" )。此命令打开一个Emacs实例,并使Emacs打印消息“hi”:

!cmd /k ""c:\program files (x86)\emacs\emacs\bin\emacs.exe" --eval ^"(message \^"hi\^")^""

还有一个编辑:包括你自己的'cmd / k'确实会产生问题,我想,如果你不只是尝试执行外部命令,而是将其输出读回Vim缓冲区。在这种情况下,您可以将输出重定向到用户主目录中的文件,并使用:read插入缓冲区。如果有办法让Vim自己的cmd使用k开关,那么这是不必要的,但如果没有,那么至少这提供了很好的解决方法。

答案 2 :(得分:0)

       %0 (batch name) %1 (1st parameter) %2 (2nd parameter)  

示例:

  

C:\ CSW&gt; MyBatchFile.bat“C:\ Program files”“C:\ CSW \ My File.txt”

不确定这是否适用于vim,但它确实适用于Windows中的bash。

答案 3 :(得分:0)

您只需要在其中添加双引号即可。 我对Vim脚本不够了解。但是在命令提示符下运行时,如果你将给出具有空格的完整exe路径,那么它将给出错误,如

C:&gt; c:\ Program Files \ Internet Explorer \ iexplore.exe

&#39; C:\程序&#39;不被视为内部或外部命令, 可操作程序或批处理文件。

但如果你被双重包围,它会奏效。

C:&gt;&#34; c:\ Program Files \ Internet Explorer \ iexplore.exe&#34;

C:&GT;