phpunit的Vim errorformat

时间:2011-03-09 11:06:58

标签: vim phpunit

我正在为PHPUnit开发一个Vim编译器插件。

我写了以下errorformat。正确提取错误消息,但文件和行号不是。

CompilerSet errorformat=%E%n)\ %.%#,
                       \%C%m,
                       \%+C%$,
                       \%C%f:%l,
                       \%Z%$

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

我很高兴报告的文件和行成为堆栈跟踪中的第一个或最后一个条目。最深刻的呼吁是问题的实际来源。跳转到顶级调用意味着我可以用来进入调用堆栈。我希望在上面的例子中使用后者SomeClassTest.php:15

1 个答案:

答案 0 :(得分:5)

我认为问题在于%Z规则的措辞。首先我想出了这个:

:set errorformat=%E%n)\ %.%#,%Z%f:%l,%C%m,%-G%.%#

这将捕获第一个文件名并将其与错误消息相关联。

出于某种原因,关联提到的 last 文件名要困难得多。我无法使用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])

这将捕获所有错误并以单行格式输出。关联的文件名和行号是错误中提到的 last 。这个脚本会破坏所有其他输出,但这可以通过添加例如在print line之后line = line.strip()