vim重定向输出到quickfix

taw*_*eed 12 vim macvim

是否可以将命令的输出重定向到快速修复窗口?

我正在运行的命令是

:!java %:r
Run Code Online (Sandbox Code Playgroud)

并希望输出进入quickfix窗口

Ing*_*kat 9

请注意,quickfix窗口用于特定输出(例如编译器或语法检查工具),其中包括当前缓冲区的引用(即行号和列号).有很多的解决此基础设施:'makeprg','errorformat',等,通常捆绑成一个编译器插件.

虽然您可以将任意输出重定向到quickfix窗口,但是'makeprg'将外部程序的输出读取到新的临时缓冲区中它几乎没有什么好处(并且具有破坏的缺点),例如:

:new|0read !java #:r
Run Code Online (Sandbox Code Playgroud)


bri*_*rns 8

我建议使用以下两个选项之一:配置makeprg为您想要的运行java,或创建一个映射或命令来填充quickfix列表而不更改任何其他内容.

选项1:使用makeprg和编译插件

makeprg正如其他人所说,我通常会为此设定选项.这不是一个黑客,这正是makeprg选项的用途.

唯一的问题是如果您还要运行另一个构建脚本.更通用的解决方案是创建一个简单的编译器插件.例如,在你的某个地方runtimepath,你可以创建一个文件compiler/java.vim并将其设置为如下所示:

if exists("current_compiler")
  finish
endif
let current_compiler = "java"

CompilerSet makeprg=java
Run Code Online (Sandbox Code Playgroud)

现在,当您使用java时,您可以执行:compiler java,然后makeprg当前窗口中根据需要设置.如果你想将它用于所有窗户,请使用:compiler! java,一声巨响.并非所有编译器插件都设置该makeprg选项,但您始终可以使用它重置它:set makeprg&.尝试:help write-compiler-plugin获取更多信息.

选项2:创建命令来执行此操作

或者,您也可以使用cexpr填充quickfix列表.例如:

:cexpr system('java ' . shellescape(expand('%:r')))
Run Code Online (Sandbox Code Playgroud)

expand扩大是必要'%:r'在表达式,并shellescape逸出,以便它可被用作一个参数外壳命令.然后将字符串'java '添加到转义路径,并将结果作为shell命令调用system.此命令的输出用于加载quickfix列表.

关于这一点的好处是它不会更改makeprg或任何其他设置,但仍然可以让您轻松填充quickfix列表.当然,您可能希望对此进行映射或为其定义自定义命令.


Jon*_*han 5

尝试这个:

  1. set makeprg=java
  2. make %:r

这有点hack,当然假设您还没有makeprg用于实际的构建脚本。