在 gVim 中后台运行 :make

35

我在Windows上使用gVim编辑我的代码(主要是C ++)。 我使用gVim中的:make编译项目,但这是一个阻塞操作,会导致我在编译完成之前无法使用gVim。 有什么方法可以异步执行:make并仍然获得将错误信息读回Vim并跳转到源代码中的好处?如果我能实时查看make进程,那就更好了。目前,:make将输出重定向到文件中,因此我看不到make的进度。


你找到了一个好的解决方案吗? - Yogesh Arora
@pydave 创建了一个名为 AsyncCommand 的插件,它实现了问题中列出的大部分功能,但无法观察到制作过程。 - Amjith
7个回答

18

我的做法是

:!gvim -c 'MyMake'
(其中MyMake是自定义命令,可以切换到适当的目录,进行make和copen 20等操作。)
我在构建过程进行时可以继续工作于另一个窗口。 其他选项: 您可以从shell或vim内部将make进度重定向到某个文件(:!make&)。然后通过使用
:cfile make_result_file

:cw
 or
:copen 20 

达到与使用:make相同的结果


请问您能详细说明一下您的MyMake命令吗?我正在尝试在Windows和MSBuild上执行类似的操作(即启动外部gvim窗口,进行make操作并打开输出),但是我无法正确地编写命令。 - rem45acp

8

7
看看我的AsyncCommand插件。它只是封装了执行某些内容所需的vim语法,并使用--remote进行加载。我已经上传了包括AsyncMake命令的AsyncCommand 2.0版本。
将脚本添加到您的.vim/plugin中,然后您就可以使用:AsyncMake:AsyncMake target进行构建。构建完成后,错误将在您的quickfix中打开。
回复更易读的代码评论:
如果您在Windows上想要查看构建结果,如果您的路径中有cygwin/unxutils/以及带有tail的其他内容,则可以在asynccommand.vim文件中更改。
call <SID>Async_Impl(tool_cmd, vim_cmd)

to

call <SID>Async_Impl(tool_cmd, vim_cmd)
call <SID>Async_Impl("tail -f ". temp_file, "")

这将会把所有的异步命令都改为在第二个命令窗口中打开输出。


嘿,感谢你制作这个插件。有没有办法看到制作过程的实时进展?我正在使用Win XP,但命令窗口在制作过程完成之前都是空白的,然后才会打开快速修复窗口。 - Amjith
我忘记了命令行窗口没有显示任何内容。我修改了答案,提供了一个可能的解决方法。 - idbrii
我添加了您上面提到的行,但我仍然有一个空的命令窗口。我使用的是Windows XP,我的路径中确实有tail。我甚至包括了tail命令的完整路径。 - Amjith
1
我没有Windows机器进行测试,但您可以尝试将该行替换为printflet tool_cmd = a:command . "| tee ". temp_file。但是,您可能需要在tee之前添加2>&1才能查看任何stderr输出。 - idbrii

4
尝试使用

:!start make

(更多信息请参见“:help!start”)-这样vim就不必等待启动的进程完成-您可以继续进行编辑。

5
如果你只是想创建一个make进程,那么"make"命令可以正常工作。我想要使用gvim的内置功能,将错误读入vim,通过双击错误信息可以跳转到源代码中的错误位置。 - Amjith

1

我会使用您操作系统内置的方法来运行后台任务。

在 Windows 上,尝试键入

:!start make

在 Linux / Mac OS X 上,请尝试

:!make > /dev/null 2>&1 &

3
如果您只是想启动一个make进程,那么"make"命令可以正常工作。我想要使用gvim的内置功能,将错误信息读入vim,并且可以通过双击错误信息在源代码中跳转到相应位置。 - Amjith

1

除非您安装了最新版本的Vim(v7.4和许多补丁,或者仅仅是Vim 8),否则您将无法在Vim中看到make的进度。现在有一些插件已经利用了它。我的BuildToolsWrapper就是其中之一。我已经在Linux和Windows上成功测试过。

在那之前,我们需要其他技巧。我记得Marc Weber的插件能够在Windows上模拟后台编译。还有一些其他的插件。我让其他人列出它们。


-1

该脚本在Windows上不可用。 - vexe
虽然这理论上回答了问题,但最好在此处包含答案的基本部分,并提供参考链接。 - Nolan Akash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接