Vims errorformat(用于解析编译/构建错误)使用c中的一种神秘格式来解析错误.
试图为nant设置一个错误格式似乎几乎是不可能的,我已经尝试了很多个小时而无法得到它.我也从我的搜索中看到,很多人似乎都遇到了同样的问题.解决这个问题的正则表达式需要一点点写.
那么为什么vim仍然使用这种格式呢?很可能C解析器速度更快,但对于最多每隔几分钟发生一次的事情几乎不相关.有一个很好的理由还是仅仅是一件历史文物?
这并不是说Vim使用来自C.相反,它使用了一个神秘的格式思路从scanf
,这是一个C函数.这意味着匹配错误消息的字符串由3部分组成:
空白
人物
转换规格
空格是你的标签和空格.字符是字母,数字和其他正常的东西.转换规范是以'%'(百分号)字符开头的序列.在scanf中,您通常会将输入字符串与%d或%f匹配,以转换为整数或浮点数.使用Vim的错误格式,您正在搜索输入字符串(错误消息)以查找文件,行和其他编译器特定信息.
如果您使用scanf从字符串"99瓶啤酒"中提取整数,那么您将使用:
int i; scanf("%d bottles of beer", &i); // i would be 99, string read from stdin
现在有了Vim的错误格式,它会变得有点棘手,但它确实试图轻松匹配更复杂的模式.比如多行错误消息,文件名,更改目录等等.错误格式帮助中的一个示例很有用:
1 Error 275 2 line 42 3 column 3 4 ' ' expected after '--' The appropriate error format string has to look like this: :set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m
这里%E告诉Vim它是多行错误消息的开始.%n是错误号.%C是多行消息的延续,%l是行号,%c是列号.%Z标记多行消息的结尾,%m匹配将在状态行中显示的错误消息.你需要使用反斜杠来逃避空间,这会增加一些额外的怪异感.
虽然使用正则表达式最初似乎更容易,但这种迷你语言专门用于帮助匹配编译器错误.它有很多快捷方式.我的意思是你不必考虑匹配多行,多个数字,匹配路径名称(只需使用%f).
另一个想法:如果您只使用正常的正则表达式,如何将数字映射到平均行数,或将字符串映射到平均值文件或错误消息?按组位置?这可能有用,但不会很灵活.另一种方式是命名捕获组,但是这个语法看起来很像是一个简短的手.你实际上可以使用regexp通配符,例如.*
- 用这种语言写它%.%#
.
好的,所以它并不完美.但这也不是不可能的,并且以自己的方式有意义.陷入困境,阅读帮助并停止抱怨!:-)