我试过阅读:help errorformat和谷歌搜索(主要是stackoverflow),但无法理解那里提到的一些模式:
%s- "指定要搜索的文本以找到错误行.[...]"
%s?之后?在它之前?或者,我不知道,这可能会污染整个模式吗?WTF?set efm+=,foobar?这里的"foobar"对我来说也是"要搜索的文字"......:/%+- 例如,我在一个问题中看到过类似的东西:%+C%.%#
%m早期/后期多线模式中使用?如果是的话,那么如果没有%.%#(== regexp .*),但是,让我们说,%+Ccont.: %.%#- 那样的东西可以捕获cont.:字符串后的东西%m吗?%C%.%#,并%+C%.%#和%+G?%A和%+A,或%E与%+E?:help errorformat-multi-line下列字符结尾:%\\@=%m- WTF的%\\@=意思是什么?我非常感谢帮助理解这些东西.
lcd*_*047 17
啊,errorformat每个人都喜欢讨厌的功能.:)
有些元首先.
:make和:cgetexpr)获取编译器的输出并将其解析为quickfix列表. errorformat是一个字符串,描述了如何完成此解析.它是一个模式列表,每个模式都是正则表达式和scanf(3)格式之间的混合.其中的一些模式匹配在编译器的输出单行,其他人尝试匹配多行(%E,%A,%C等),其他都保持各种状态(%D,%X),其他改变方式解析收益(%>),而还有一些简单的制作中的邮件qflist(%G),或忽略input(%-G)中的行.并非所有组合都有意义,在你看到Vim的来源之前,你很可能不会弄清楚所有的细节.耸errorformats let &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
Run Code Online (Sandbox Code Playgroud)
然后跑: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早期/后期多线模式中使用?
是的,它由附加的匹配线的内容%+C到message由较早的(未更新)多模式产生(%A,%E,%W,或%I).
如果是的话,那么如果没有
%.%#(== regexp.*),但是,让我们说,%+Ccont.: %.%#- 那样的东西可以捕获cont.:字符串后的东西%m吗?
随着号%+Ccont.: %.%#只匹配正则表达式的线条^cont\.: .*$都认为,该行不匹配它被忽略.然后将整行附加到前一行%m,而不仅仅是后面的部分cont.:.
还有,有什么之间的区别
%C%.%#,并%+C%.%#和%+G?
%Chead %m trail匹配^head .* trail$,然后只将中间部分添加到前一部分%m(它丢弃head和trail).
%+Chead %m trail匹配^head .* trail$,然后将整行附加到前一行%m(包括head和trail).
%+Gfoo匹配一行开头,foo并简单地将整行作为消息添加qflist(即只有一个message字段的错误).
还有,有什么之间的区别
%A和%+A,或%E与%+E?
%A并%E启动多行模式. %+似乎意味着"添加正在解析的整行message,无论其位置如何%m".
最后,Python的示例以
:help errorformat-multi-line下列字符结尾:%\\@=%m- WTF的%\\@=意思是什么?
%\\@=转换为regexp限定符\@=,"匹配前面的原子与零宽度".