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

时间:2015-03-16 22:57:53

标签: vim errorformat

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

  • %s - "指定要搜索的文本以找到错误行。 [...]"
    • 嗯,首先,试着理解句子,在%s之后,我在哪里将"文本搜索到#34;?在它之前?或者,我不知道,这可能会污染整个模式吗? WTF?
    • 其次,这个模式实际上做了什么,它与模式中的常规文本有什么不同,比如某种set efm+=,foobar? " foobar"这里也是#34;文本搜索" ...:/
  • %+ - 例如我I've seen something like that used in one question%+C%.%#
    • 是否意味着整行将附加到早期/后期多行模式中使用的%m?如果是,那么如果没有%.%#(== regexp .*)会怎样,但是,让我们说%+Ccont.: %.%# - 就像这样的东西可以捕获之后的东西cont.:中的%m字符串?
    • 另外,%C%.%#%+C%.%#以及%+G之间的区别是什么?
    • 另外,%A%+A%E%+E之间的区别是什么?
  • 最后,:help errorformat-multi-line中的Python示例以下列字符结尾:%\\@=%m - WTF执行%\\@=是什么意思?

我非常感谢能帮助你理解这些东西。

1 个答案:

答案 0 :(得分:14)

啊,errorformat,每个人都喜欢讨厌的特征。 :)

有些元首先。

  • 某些Vim命令(例如:make:cgetexpr)获取编译器的输出并将其解析为quickfix列表。 errorformat是一个字符串,描述了如何完成此解析。它是一个模式列表,每个模式都是正则表达式和scanf(3)格式之间的混合。其中一些模式匹配编译器输出中的单行,其他模式尝试匹配多行(%E%A%C等),其他模式保持各种状态(%D%X),其他人改变解析进行的方式(%>),而其他人只是在qflist%G)中生成消息,或者忽略输入中的行( %-G)。并非所有组合都有意义,在你看到Vim的来源之前,你很可能不会弄清楚所有的细节。 耸肩
  • 您可能希望使用errorformat而不是let &erf='...'来撰写set erf=...。语法 更加人性化。
  • 您可以使用errorformat体验cgetexprcgetexpr需要一个列表,它将其解释为编译器输出中的行。结果是qflist(或语法错误)。
  • qflist是错误列表,每个错误都是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。当您运行:cc时,Vim会尝试找到与^\V" bar\$匹配的行,然后将其发送给您。这是当前文件中的倒数第二行。

  

其次,这个模式实际上做了什么,它与模式中的常规文本有什么不同,比如某种set efm+=,foobar

set efm+=foobar %m将在foobar开头的编译器输出中查找一行,然后将该行的其余部分分配给相应错误中的message字段。

%s从编译器的输出中读取一行,并将其转换为相应错误中的pattern字段。

  

%+ - 例如我在一个问题中看到了类似的内容:%+C%.%#   是否意味着整行将附加到早期/后期多行模式中使用的%m

是的,它会将%+C匹配的行的内容附加到之前(不是更晚)的多行模式message%A生成的%E,{ {1}}或%W)。

  

如果是,那么如果没有%I(== regexp %.%#)会怎么样,但是,让我们说,.* - 这样的事情会在%+Ccont.: %.%#的字符串cont.:

没有。对于%m,仅考虑与正则表达式%+Ccont.: %.%#匹配的行,忽略与其不匹配的行。然后整行都附加到上一个^cont\.: .*$,而不仅仅是%m后面的部分。

  

此外,cont.:%C%.%#%+C%.%#之间的区别是什么?

%+G匹配%Chead %m trail,然后仅将中间部分添加到上一个^head .* trail$(它会丢弃%mhead)。

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

trail匹配以%+Gfoo开头的行,只需将整行添加为foo中的消息(即只有qflist字段的错误)。

  

另外,message%A%+A%E之间的区别是什么?

%+E%A启动多行模式。 %E似乎意味着“将正在解析的整行添加到%+,而不管message”的位置。

  

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

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