17

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

我正在运行的命令是

:!java %:r

并希望输出会进入快速修复窗口

4

4 回答 4

14

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

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

正如其他人所说,我通常会makeprg为此设置选项。这不是黑客,这正是该makeprg选项的用途。

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

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

CompilerSet makeprg=java

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

选项 2:创建一个命令来执行它

或者,您也可以使用cexpr填充快速修复列表。例如:

:cexpr system('java ' . shellescape(expand('%:r')))

expand必要扩展'%:r'表达式中的 ,并将shellescape其转义,以便它可以用作 shell 命令的参数。然后将该字符串'java '添加到转义路径的前面,并将结果作为 shell 命令调用system。此命令的输出用于加载 quickfix 列表。

这样做的好处是它不会更改makeprg或任何其他设置,但仍然可以让您轻松填充快速修复列表。当然,您可能想要映射它或为其定义自定义命令。

于 2014-08-25T15:40:53.867 回答
13

请注意,快速修复窗口用于特定输出(例如编译器或语法检查工具),其中包括对当前缓冲区的引用(即行号和列号)。围绕这个有很多基础设施:'makeprg''errorformat'等,通常捆绑到编译器插件中。

尽管您可以将任意输出重定向到 quickfix 窗口,但与将外部程序的输出读取到新的暂存缓冲区相比,它几乎没有好处(并且具有破坏的缺点'makeprg'),例如:

:new|0read !java #:r
于 2013-08-08T06:25:18.853 回答
6

试试这个:

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

这有点小技巧,当然假设您还没有将makeprg其用于实际的构建脚本。

于 2013-08-08T00:05:24.327 回答
0

我映射了 leader + j + r 来运行我的 java 代码并通过执行在 quickfix 窗口中显示它

map <leader>jr :set makeprg=java <CR>:make %:r<CR>:copen<CR>
于 2013-08-08T00:57:17.480 回答