vim errorformat中一些高级模式的含义是什么?(%s,%+,%\\ @ =)

aka*_*vel 8 vim errorformat

我试过阅读:help errorformat和谷歌搜索(主要是stackoverflow),但无法理解那里提到的一些模式:

  • %s- "指定要搜索的文本以找到错误行.[...]"
    • 嗯,首先,试着理解这句话,我在哪里把"文字搜索",在%s?之后?在它之前?或者,我不知道,这可能会污染整个模式吗?WTF?
    • 其次,这个模式实际上做了什么,它与模式中的常规文本有什么不同,比如某种类型set efm+=,foobar?这里的"foobar"对我来说也是"要搜索的文字"......:/
  • %+- 例如,我在一个问题中看到过类似的东西:%+C%.%#
    • 是否意味着整条线将附加到%m早期/后期多线模式中使用?如果是的话,那么如果没有%.%#(== regexp .*),但是,让我们说,%+Ccont.: %.%#- 那样的东西可以捕获cont.:字符串后的东西%m吗?
    • 还有,有什么之间的区别%C%.%#,并%+C%.%#%+G
    • 还有,有什么之间的区别%A%+A,或%E%+E
  • 最后,Python的示例以:help errorformat-multi-line下列字符结尾:%\\@=%m- WTF的%\\@=意思是什么?

我非常感谢帮助理解这些东西.

lcd*_*047 17

啊,errorformat每个人都喜欢讨厌的功能.:)

有些元首先.

  • 一些Vim命令(例如: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从编译器的输出中读取一行并将其转换patternqflist.就是这样.要查看它的工作原理,请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早期/后期多线模式中使用?

是的,它由附加的匹配线的内容%+Cmessage由较早的(未更新)多模式产生(%A,%E,%W,或%I).

如果是的话,那么如果没有%.%#(== regexp .*),但是,让我们说,%+Ccont.: %.%#- 那样的东西可以捕获cont.:字符串后的东西%m吗?

随着号%+Ccont.: %.%#只匹配正则表达式的线条^cont\.: .*$都认为,该行不匹配它被忽略.然后将整行附加到前一行%m,而不仅仅是后面的部分cont.:.

还有,有什么之间的区别%C%.%#,并%+C%.%#%+G

%Chead %m trail匹配^head .* trail$,然后只将中间部分添加到前一部分%m(它丢弃headtrail).

%+Chead %m trail匹配^head .* trail$,然后将整行附加到前一行%m(包括headtrail).

%+Gfoo匹配一行开头,foo并简单地将整行作为消息添加qflist(即只有一个message字段的错误).

还有,有什么之间的区别%A%+A,或%E%+E

%A%E启动多行模式. %+似乎意味着"添加正在解析的整行message,无论其位置如何%m".

最后,Python的示例以:help errorformat-multi-line下列字符结尾:%\\@=%m- WTF的%\\@=意思是什么?

%\\@=转换为regexp限定符\@=,"匹配前面的原子与零宽度".