如何使用任意 linter 输出填充 Vim/Neovim 的 quickfix 列表或位置列表?

How to populate the quickfix list or location list of Vim/Neovim with arbitrary linter output?

假设我只是 运行 终端中的 linter,我有一堆标准格式的 linter 输出:

path/to/some/file.foo:45:23: This is an error message
path/to/some/file.foo:46:12: This is another error message
...

我目前正在 Neovim 中手动打开每个文件,导航到正确的行并修复问题。

相反,我想用这些信息填充 Vim 或 Neovim 中的快速修复或位置列表,这样我就可以快速跳转到每个位置并修复错误。

实现此目标的 simplest/quickest 方法是什么?

这就是 :help -q command-line 标志的用途:

$ vim -q errorfile

您可以将 linter 的输出重定向到一个文件,然后将该文件传递给 Vim 的 -q:

$ yourlinter file.foo > errorfile
$ vim -q errorfile

如果您的 shell 允许,您可以使用进程替换来删除中间步骤和 ghost 文件:

$ vim -q <(yourlinter)

或者,如果你已经 运行 你的 linter 并且忘记将它传递给 Vim,你可以 re-run 它并通过进程替换将它传递给 Vim:

$ vim -q <(!!)

由于这是我经常遇到的情况,我在几年前将此命令添加到我的 bash 配置中:

# open Vim with output of last command in quickfix
vimq() {
    vim -q <($(fc -nl -1))
}

这让我可以做:

$ yourlinter file.foo
(output of linter)
$ vimq

注意:fc -nl -1!! 更可移植——因此在脚本上下文中更可取——调用上一个命令的方法。参见 $ man fc

注意:您在问题中只提到了 quickfix list,但是,如果您还想要 quickfix window,您可以在命令中再添加一项::help :cwindow.

$ vim -q <(!!) +cw