我正在尝试使用:!<cmd>vim中的格式来执行外部命令并将结果放入缓冲区.如果我键入:!,路径完成是可能的,我可以完成路径直到我想要执行的命令.这会自动转义空格,如下所示:
:!c:\Program\ Files\ (x86)\Microsoft\ Visual\ Studio\ 9.0\Common7\IDE\TF.exe
Run Code Online (Sandbox Code Playgroud)
当我点击进入时,我得到:
'c:\Program\' is not recognized as an internal or external command
Run Code Online (Sandbox Code Playgroud)
我怀疑这意味着当将命令传递给cmd.exe时,vim没有正确地转义空间.我已经尝试过各种各样的逃避组合来完成这项工作,但无济于事.我发现这样做的唯一方法是弄清楚DOS8.3文件名是什么,并使用它而不是长路径名.但是,我不喜欢这种方法,因为它会使我的脚本不那么便携.有谁知道这是否可以做到,还是vim中的错误?
如果您引用了参数,而不仅仅是 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 \^"#\^"'
Run Code Online (Sandbox Code Playgroud)
另外,我想知道路径周围的引号是否需要特殊处理,因为它们仅是完整命令的一部分。无论如何,引号\^"适用于命令行中的主引号,^"嵌入其他引号中的引号。我过去发现在 Windows 提示符下试验该命令很有用,记得用 Vim 准备它的方式来测试它,即在命令前面加上c:\windows\sys32\cmd.exe.
再想一想,我认为当我处理类似的问题时,我从来没有达到在同一命令中使用带引号的参数和带引号的 exe-path-with-spaces 来解决命令的点。我希望有办法做到这一点,但我只是在路径中创建了一个到 exe 的软链接,没有空格。例如:
mklink c:\users\myname\myexe c:\program files(x86)\myapp\myexe.exe
Run Code Online (Sandbox Code Playgroud)
完成此操作后,无需引用 exe 命令本身并用\^"正常工作。我当然很好奇如何引用exe-with-spaces也引用了论点。
编辑:我想我找到了解决引用问题的方法,没有 VS 来测试你的确切命令,但我认为这可以从命令行工作:
cmd /k ""C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\TF.exe" history /followbranches ^"#^""
Run Code Online (Sandbox Code Playgroud)
如果这对你来说在命令行中有效,那么我认为唯一的问题是让 Vim 包含 /k 开关。(此外,由于正斜杠,Windows 命令行“丢弃”/followbranch 开关可能会出现问题,但也可能不会。)
EDIT2:我认为从 Vim 执行此操作的技巧只是将“cmd /k”作为您正在运行的命令的一部分包含在内。你最终会打开几个级别的外壳,但我认为这不是问题。例如,这里是从 Vim 运行的,其中 (1) exe 路径中有空格,(2) 带引号的参数 ( ) (message .. ),甚至 (3) 带引号的参数中的引号 ( \^"hi\^")。此命令打开一个 Emacs 实例并让 Emacs 打印消息“hi”:
!cmd /k ""c:\program files (x86)\emacs\emacs\bin\emacs.exe" --eval ^"(message \^"hi\^")^""
Run Code Online (Sandbox Code Playgroud)
还有一处编辑:我认为,如果您不仅尝试执行外部命令,还将其输出读回 Vim 缓冲区,那么包含您自己的 'cmd /k' 确实会产生问题。在这种情况下,您可以将输出重定向到用户主目录中的文件并用于:read插入到缓冲区中。如果有某种方法可以让 Vim 自己的 cmd 使用 k 开关,那么这将是不必要的,但如果没有,那么至少这提供了很好的解决方法。