啊,errorformat每个人都喜欢讨厌的功能。:)
首先是一些元数据。
- 一些 Vim 命令(例如
:make和:cgetexpr)获取编译器的输出并将其解析为quickfix列表。 errorformat是一个描述如何完成解析的字符串。scanf(3)这是一个模式列表,每个模式都是正则表达式和格式之间的一种混合。其中一些模式匹配编译器输出中的单行,其他模式尝试匹配多行(%E,%A等%C),其他模式保持各种状态(%D, %X),其他模式改变解析进行的方式(%>),而其他模式只是在qflist( %G),或忽略输入 ( %-G) 中的行。并不是所有的组合都有意义,而且在查看 Vim 的源代码之前,您很可能无法弄清楚所有细节。耸耸肩
- 你可能想用
errorformatslet &erf='...'而不是set erf=.... 语法更加人性化。
- 您可以尝试
errorformat使用cgetexpr. cgetexpr需要一个列表,它将其解释为编译器输出中的行。结果是qflist(或语法错误)。
qflists 是错误列表,每个错误都是 Vim “字典”。请参阅:help getqflist()(简化)格式。
- 错误可以标识文件中的位置,它们可以是简单的消息(如果缺少标识位置的基本数据),它们可以是有效的或无效的(无效的本质上是解析的剩余部分)。
qflist你可以用类似的东西显示当前:echomsg string(getqflist()),或者你可以在一个漂亮的窗口中看到它:copen(虽然一些重要的细节没有显示在窗口中)。 :cc将带您到第一个错误的位置(假设第一个错误qflist实际上是指文件中的错误)。
现在回答你的问题。
嗯,首先,试图完全理解这句话,我应该把“要搜索的文本”放在哪里%s?之前呢?
你没有。 %s从编译器的输出中读取一行并将其转换pattern为qflist. 这就是它所做的一切。要在工作中查看它,请创建一个efm.vim包含以下内容的文件:
let &errorformat ='%f:%s:%m'
cgetexpr ['efm.vim:" bar:baz']
echomsg string(getqflist())
copen
cc
" bar baz
" bar
" foo bar
然后运行:so%,并尝试了解发生了什么。 %f:%s:%m查找三个字段:文件名、%s事物和消息。输入行是efm.vim:" bar:baz,解析为文件名efm.vim(即当前文件)、模式^\V" bar\$和消息baz。当你运行时,:ccVim 会尝试找到匹配的行^\V" bar\$,并将你发送到那里。这是当前文件中的倒数第二行。
其次,这个模式实际上是做什么的,它与模式中的常规文本有什么不同,比如某种set efm+=,foobar?
set efm+=foobar %m将在编译器的输出中查找以 开头的foobar行,然后将该行的其余部分分配给message相应错误中的字段。
%s从编译器的输出中读取一行并将其转换为pattern相应错误中的一个字段。
%+- 例如,我在一个问题中看到过类似的东西:%+C%.%#
这是否意味着整行将被附加到%m早期/后期多行模式中使用的 a 上?
是的,它将匹配的行的内容附加%+C到message由较早(而不是较晚)多行模式(%A、%E、%W或%I)产生的内容。
如果是,那么如果没有%.%#(== regexp .*)怎么办,但是,比方说,%+Ccont.: %.%#- 这样的东西是否可以仅捕获cont.:字符串之后的内容到%m?
不。%+Ccont.: %.%#只考虑与正则表达式匹配^cont\.: .*$的行,不匹配的行将被忽略。然后将整行附加到前一行%m,而不仅仅是后面的部分cont.:。
%C%.%#另外, and%+C%.%#和 和有什么区别%+G?
%Chead %m trail匹配^head .* trail$,然后仅将中间部分附加到前一个%m(它丢弃head和trail)。
%+Chead %m trail匹配^head .* trail$,然后将整行附加到前一行%m(包括headand trail)。
%+Gfoo匹配以 开头的行foo并简单地将整行添加为消息qflist(即只有一个message字段的错误)。
%A另外, and%+A或%Evs.之间有什么区别%+E?
%A并%E开始多线模式。 %+似乎意味着“添加被解析的整行message,不管”的位置%m。
最后,Python 的示例以:help errorformat-multi-line以下字符结尾:%\\@=%m-- WTF%\\@=是什么意思?
%\\@=转换为正则表达式限定符\@=,“匹配前面的原子宽度为零”。