[英]Debugging vim errorformat
我将我的makeprg
设置为PHPUnit
setlocal makeprg=phpunit\\ --configuration\\ tests/phpunit.xml
但是,尝试使errorformat正常工作真是一场噩梦。 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%.%#
仅使用||
打印行 。 我应该如何调试呢? 我觉得我在黑暗中猛烈抨击。
尝试的主要问题是错误与您期望的错误方式不匹配。 它实际上是这样的:读取错误行,并依次与errorformat
中的规则匹配; 第一个匹配的规则获胜。 然后读取另一条错误行,并再次与errorformat
中的规则进行匹配。 等等。 诸如%>
类的东西可能会影响规则的尝试顺序,并且对将信息从一个规则传递到另一条规则的支持有限,但是基本上,如果您无法通过匹配将错误线与其他规则区分开,则可以不要将其分配给给定的字段。
特别是,如果您无法区分行Failed asserting that 1 matches expected 2.
则从Time: 177 ms, Memory: 12.50MB
,从F
以及从Tests: 1, Assertions: 1, Failures: 1.
,您可以不要将其包含在错误消息中。 为了克服这个问题,您可能需要像syntastic一样“预处理”错误,以获取1) dummy_test::testController
和Failed asserting that 1 matches expected 2.
在同一行上Failed asserting that 1 matches expected 2.
,以便您可以解析它们。
无论如何,考虑到所有这些,这是一个基本框架(基于此启发性文章)以及同样粗略的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:
error There was 1 failure:
等,然后将其余行插入错误消息。 不过,您仍然会很高兴处理空行。 祝你好运。 :)
编辑:我更改了errorformat
以删除已知的固定模式。 您可能需要再摆弄一些,结果仍然很脆弱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.