我正在尝试在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中的错误?
答案 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
。
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;