8

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

  • %s- “指定要搜索的文本以定位错误行。[...]”
    • 嗯,首先,试图完全理解这句话,我应该把“要搜索的文本”放在哪里%s?之前呢?或者,我不知道,它是否会污染整个模式?怎么回事?
    • 其次,这个模式实际上是做什么的,它与模式中的常规文本有什么不同,比如某种set efm+=,foobar?这里的“foobar”对我来说也是“要搜索的文本”......:/
  • %+- 例如,我在一个问题中看到过类似的东西%+C%.%#
    • 这是否意味着整行将被附加到%m早期/后期多行模式中使用的 a 中?如果是,那么如果没有%.%#(== regexp .*)怎么办,但是,比方说,%+Ccont.: %.%#- 这样的东西是否可以仅捕获cont.:字符串之后的内容到%m?
    • %C%.%#另外, and%+C%.%#和 和有什么区别%+G
    • %A另外, and%+A%Evs.之间有什么区别%+E
  • 最后,Python 的示例以:help errorformat-multi-line以下字符结尾:%\\@=%m-- WTF%\\@=是什么意思?

对于理解这些东西的帮助,我将不胜感激。

4

1 回答 1

21

啊,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从编译器的输出中读取一行并将其转换patternqflist. 这就是它所做的一切。要在工作中查看它,请创建一个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 上?

是的,它将匹配的行的内容附加%+Cmessage由较早(而不是较晚)多行模式(%A%E%W%I)产生的内容。

如果是,那么如果没有%.%#(== regexp .*)怎么办,但是,比方说,%+Ccont.: %.%#- 这样的东西是否可以仅捕获cont.:字符串之后的内容到%m?

不。%+Ccont.: %.%#只考虑与正则表达式匹配^cont\.: .*$的行,不匹配的行将被忽略。然后将整行附加到前一行%m,而不仅仅是后面的部分cont.:

%C%.%#另外, and%+C%.%#和 和有什么区别%+G

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

%+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%\\@=是什么意思?

%\\@=转换为正则表达式限定符\@=,“匹配前面的原子宽度为零”。

于 2015-03-17T15:22:24.433 回答