是否可以将命令的输出重定向到快速修复窗口?
我正在运行的命令是
:!java %:r
并希望输出会进入快速修复窗口
我会建议以下两个选项之一:配置makeprg
为按照您的需要运行 java,或者创建一个映射或命令来填充 quickfix 列表而不更改任何其他内容。
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
了解更多信息。
或者,您也可以使用cexpr
填充快速修复列表。例如:
:cexpr system('java ' . shellescape(expand('%:r')))
有expand
必要扩展'%:r'
表达式中的 ,并将shellescape
其转义,以便它可以用作 shell 命令的参数。然后将该字符串'java '
添加到转义路径的前面,并将结果作为 shell 命令调用system
。此命令的输出用于加载 quickfix 列表。
这样做的好处是它不会更改makeprg
或任何其他设置,但仍然可以让您轻松填充快速修复列表。当然,您可能想要映射它或为其定义自定义命令。
请注意,快速修复窗口用于特定输出(例如编译器或语法检查工具),其中包括对当前缓冲区的引用(即行号和列号)。围绕这个有很多基础设施:'makeprg'
、'errorformat'
等,通常捆绑到编译器插件中。
尽管您可以将任意输出重定向到 quickfix 窗口,但与将外部程序的输出读取到新的暂存缓冲区相比,它几乎没有好处(并且具有破坏的缺点'makeprg'
),例如:
:new|0read !java #:r
试试这个:
set makeprg=java
make %:r
这有点小技巧,当然假设您还没有将makeprg
其用于实际的构建脚本。
我映射了 leader + j + r 来运行我的 java 代码并通过执行在 quickfix 窗口中显示它
map <leader>jr :set makeprg=java <CR>:make %:r<CR>:copen<CR>