【问题标题】:Vim errorformat multiline stringVim 错误格式多行字符串
【发布时间】:2015-06-10 03:43:02
【问题描述】:

我正在尝试为Flow 解析此错误输出。在第一个错误中,真正重要的是第二个文件和行号,而不是第一个。我想告诉 vim 使用第二个文件条目。 (所以在这种情况下,位置列表应该跳转到 source.js 的第 94 行,而不是第 20 行)

/Users/asdf/source.js:20:22,34:1: property hidden
Property not found in
/Users/asdf/source.js:94:10,106:3: object literal

/Users/asdf/source.js:25:14,18: identifier strin
Could not resolve name

Here's the error format currently defined for flow:除了它使用第一个文件名而不是第二个文件名之外,它可以工作。

let errorformat =
    \ '%f:%l:%c:%n: %m,' .
    \ '%f:%l:%c: %m'

尝试的解决方案

我一直在尝试使用多行错误格式,但我不知道自己在做什么。在阅读:help errorformat 之后,似乎这样的事情应该可以工作,但它只是将整个错误加载到消息中,没有文件/行信息。它还使用第一个条目而不是第三个条目匹配第二个错误。

let errorformat =
    \ '%E%m,%C%m,%Z%f:%l:%c:%n: %m,' .
    \ '%f:%l:%c:%n: %m,' .
    \ '%f:%l:%c: %m'

更新

感谢 lcd047,他指出我没有匹配正确的输出。 Syntastic 将错误格式化如下,全部在一行中:

/Users/seanhess/projects/serials/web/app/model/source.js:20:22: property hidden Property not found in object literal (/Users/seanhess/projects/serials/web/app/model/source.js:94:10,106:3)

那么,新问题,我怎样才能匹配第二个位置而不是第一个?我想我宁愿忽略第一个位置。

更新答案 - 这有效:

let errorformat =
    \ '%.%#: %m (%f:%l:%c\,%.%#),' .
    \ '%f:%l:%c:%n: %m,' .
    \ '%f:%l:%c: %m'

【问题讨论】:

  • 您对语法代码的阅读是错误的。 Syntastic 使用流的 JSON 输出 re-formats it,而 then 使用您提到的 errorformat。这一切都是有原因的。 IMO 您尝试在不通过 JSON 的情况下使其工作几乎没有成功的机会。
  • 哇,谢谢,你说得对!它将所有内容归为一行:/Users/seanhess/projects/serials/web/app/model/source.js:20:22: property hidden Property not found in o bject literal (/Users/seanhess/projects/serials/web/app/model/source.js:94:10,106:3)。这更有意义,谢谢!
  • 其实我上面提到的函数syntastic#preprocess#flow()确实是对JSON进行解码,然后将结果格式化为符合flow.vim中的errorformat,逐个字段。它不只是加入文本输出中的行。它不读取(也不关心)流的文本输出。
  • 更新了问题以反映这一点。谢谢!

标签: javascript vim syntastic errorformat flowtype


【解决方案1】:

您没有获得文件/行信息,因为 %E 指定使用该行的其余部分作为多行消息的开头。

尝试将初学者的“%Em”更改为“%E%f:%l:%c:%n:%m”,因为您基本上希望保留从第一个版本的errorformat获取的所有原始数据.

您可能希望将“%Cm”更改为“%+Cm”以捕获错误输出中的所有行。

"%Z%f:%l:%c:%n: %m" 看起来不错,应该在第二行使用,因为 %E 会捕获第一行。

试试看。

【讨论】:

  • 很遗憾,:%l:%c:%n: :20:22,34:1: 不匹配。
  • 在这种情况下,将“%E...”更改为实际匹配第一行。小心逗号!在某些语言环境中,“1000”被打印为“1,000”。
  • 等等,我很困惑。你是说我的多行条目应该有两行:一个是 %E,第二个是 %Z,它们都应该包含所有文件捕获?我只是试过了,位置列表正在使用错误第一行中的文件/行。我想忽略那个并使用错误第 3 行中的文件/行。
  • %E 开始多行捕获。它将继续捕获直到它匹配 end 模式,这就是 %Z 的用途。这东西不容易。例如,您可以通过键入 ":e $VIMRUNTIME/compiler/mips_c.vim" 查看 mips_c.vim 编译器文件。我写了那个,它需要相当多的试验和错误。另一件事:注意条目的顺序。
  • 谢谢大卫,我不知道如何测试这个,因为我的输入不是我想象的那样。不过感谢您的帮助!
猜你喜欢
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
  • 2016-09-06
  • 2011-08-17
  • 2018-05-20
相关资源
最近更新 更多