我正在为PHPUnit开发一个Vim编译器插件.
我写了以下内容errorformat.正确提取错误消息,但文件和行号不是.
CompilerSet errorformat=%E%n)\ %.%#,
\%C%m,
\%+C%$,
\%C%f:%l,
\%Z%$
Run Code Online (Sandbox Code Playgroud)
PHPUnit的输出看起来像这样:
PHPUnit 3.5.12 by Sebastian Bergmann.
............................................................... 63 / 134 ( 47%)
.........................E.....
Time: 0 seconds, Memory: 11.25Mb
There was 1 error:
1) SomeClassTest::testSomething
Undefined property: SomeClass::$var
/path/to/SomeClass.php:99
/path/to/SomeClassTest.php:15
FAILURES!
Tests: 94, Assertions: 170, Errors: 1.
Press ENTER or type command to continue
Run Code Online (Sandbox Code Playgroud)
我很高兴报告的文件和行成为堆栈跟踪中的第一个或最后一个条目.最深刻的呼吁是问题的实际来源.跳转到顶级调用意味着我可以用来进入调用堆栈.SomeClassTest.php:15在上面的例子中,我更喜欢后者.
我认为问题在于%Z规则的措辞.首先我想出了这个:
:set errorformat=%E%n)\ %.%#,%Z%f:%l,%C%m,%-G%.%#
Run Code Online (Sandbox Code Playgroud)
这将捕获第一个文件名并将其与错误消息相关联.
出于某种原因,关联提到的最后一个文件名要困难得多.我无法做到这一点efm,而是将这个Python过滤器混合在一起:
import sys
import re
errors = []
OTHER = 0
MESSAGE = 1
FILE_LINE = 2
next_is = OTHER
lines = sys.stdin.readlines()
for line in lines:
line = line.strip()
if (next_is == OTHER):
if (re.search("^[0-9]+\)", line)):
next_is = MESSAGE
elif (next_is == MESSAGE):
errors.append([line, ''])
next_is = FILE_LINE
elif (next_is == FILE_LINE):
if (re.search("^.+:[0-9]+", line)):
errors[-1][1] = line
elif (len(line) == 0 and len(errors[-1][1]) > 0):
next_is = OTHER
for error in errors:
print "{0}:{1}".format(error[1], error[0])
Run Code Online (Sandbox Code Playgroud)
这将捕获所有错误并以单行格式输出.相关的文件名和行号是错误中提到的最后一个.这个脚本会破坏所有其他输出,但这可以通过添加例如print lineafter 来解决line = line.strip().
| 归档时间: |
|
| 查看次数: |
561 次 |
| 最近记录: |