繁体   English   中英

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

[英]What's the meaning of some advanced patterns in vim errorformat? (%s, %+, %\\@=)

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

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

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

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

有些元首先。

  • 一些Vim命令(例如:make:cgetexpr )获取编译器的输出并将其解析为quickfix列表。 errorformat是一个描述如何完成此解析的字符串。 它是一个模式列表,每个模式都是regexp和scanf(3)格式之间的混合。 其中一些模式匹配编译器输出中的单行,其他模式匹配多行( %E%A%C等),其他模式保持各种状态( %D%X ),其他模式改变解析进行的方式( %> ),而其他人只是在qflist%G )中生成消息,或忽略输入中的行( %-G )。 并非所有组合都有意义,在你看到Vim的来源之前,你很可能不会弄清楚所有的细节。
  • 您可能希望使用let &erf='...'而不是set erf=...来编写errorformat 语法是更加人性化。
  • 您可以使用cgetexpr试验errorformat cgetexpr需要一个列表,它将其解释为编译器输出中的行。 结果是qflist (或语法错误)。
  • qflist是错误列表,每个错误都是Vim“字典”。 请参阅:help getqflist()获取(简化)格式。
  • 错误可以识别文件中的位置,它们可以是简单的消息(如果缺少标识位置的基本数据),并且它们可以是有效的或无效的(无效的那些本质上是解析的剩余部分)。
  • 您可以使用以下内容显示当前的qflist :echomsg string(getqflist()) ,或者您可以在一个漂亮的窗口中看到它:copen (尽管窗口中没有显示一些重要的细节)。 :cc将带您到第一个错误的位置(假设qflist的第一个错误实际上是指文件中的错误)。

现在回答你的问题。

嗯,首先,尝试理解句子,在%s之后我在哪里放“搜索文本”? 在它之前?

你没有。 %s读取来自编译器的输出线,并将其转换到patternqflist 就是这样。 要查看它的工作原理, efm.vim使用以下内容创建一个文件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

是的,它由附加的匹配线的含量%+Cmessage通过对早期(不晚)多模式(产生%A%E%W ,或%I )。

如果是的话,那么如果没有%.%# (== regexp .* ),但是,让我们说, %+Ccont.: %.%# - 就像这样的工作只捕获一个cont.:后的东西cont.:字符串进入%m

%+Ccont.: %.%#只考虑与regexp ^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限定符\\@= ,“匹配前面的原子与零宽度”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM