调试vim errorformat

时间:2016-09-01 18:15:39

标签: vim

我将makeprg设置为PHPUnit

setlocal makeprg=phpunit\ --configuration\ tests/phpunit.xml

但是,尝试使错误格式工作是一场噩梦。 PHPUnit的输出是这样的:

PHPUnit 4.8.27 by Sebastian Bergmann and contributors.

F

Time: 177 ms, Memory: 12.50MB

There was 1 failure:

1) dummy_test::testController
Failed asserting that 1 matches expected 2.

/Users/david/Sites/apr2/frontend/intranet/tests/unit/dummy_test.php:44

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.

我尝试的errorformat是:setlocal errorformat=%A%.%#,%C%n\)\ %.%#,%m,%.%#,%Z%f:%l,%-G%.%#

仅使用||打印行。我该怎么调试呢?我觉得我在黑暗中抨击。

1 个答案:

答案 0 :(得分:2)

您尝试的主要问题是错误与您期望的错误不匹配。它实际上是这样的:读取错误行,然后它与errorformat中的规则相匹配;匹配的第一条规则获胜。然后读取另一个错误行,并再次根据errorformat中的规则进行匹配。等等。像%>这样的东西会影响规则的尝试顺序,并且对从一个规则传递信息到另一个规则的支持有限,但基本上,如果你不能通过匹配将错误行与其他规则区分开来,你不能将它分配给给定的字段。

特别是,如果您无法将行Failed asserting that 1 matches expected 2.Time: 177 ms, Memory: 12.50MBFTests: 1, Assertions: 1, Failures: 1.区分开来,则不能将其包含在错误中信息。要解决这个问题,您可能需要按照syntastic的方式“预处理”错误,以便在同一行上获取1) dummy_test::testControllerFailed asserting that 1 matches expected 2.,以便您可以解析它们。

无论如何,考虑到所有这些,这里是一个基本的框架(基于this照亮帖子),同样粗糙的errorformat

let &errorformat =
    \ '%-G,' .
    \ '%-GPHPUnit %.%#,' .
    \ '%-GF,' .                  
    \ '%-GTime: %.%#\, Memory: %.%#,' .
    \ '%-GThere was 1 failure:,' .
    \ '%-GFAILURES!,' .
    \ '%-GTests: %.%#\, Assertions: %.%#\, Failures: %.%#,' .
    \ '%E%n) %m,' .              
    \ '%C%f:%l,' .               
    \ '%C%m'
cgetexpr [
        \ 'PHPUnit 4.8.27 by Sebastian Bergmann and contributors.',
        \ '',
        \ 'F',
        \ '',
        \ 'Time: 177 ms, Memory: 12.50MB',
        \ '',
        \ 'There was 1 failure:',
        \ '',
        \ '1) dummy_test::testController',
        \ 'Failed asserting that 1 matches expected 2.',
        \ '',
        \ '/Users/david/Sites/apr2/frontend/intranet/tests/unit/dummy_test.php:44',
        \ '',
        \ 'FAILURES!',
        \ 'Tests: 1, Assertions: 1, Failures: 1.',
    \ ]

echomsg string(map(getqflist(), '[v:val.text, v:val.valid]'))
echomsg string(getqflist())
copen
wincmd p

上面的errorformat产生以下内容,这不是完全有用,但也不是完全没用:

/Users/david/Sites/apr2/frontend/intranet/tests/unit/dummy_test.php|44 error 1| dummy_test::testController

也许你可以通过杀死已知的固定模式Time:...There was 1 failure:等来改进这一点,然后将剩余的行吞噬到错误消息中。尽管如此,你仍然可以处理空行。祝你好运。 :)

编辑:我更改了errorformat以删除已知的固定模式。你可能需要多做一些,结果仍然是脆弱的。