[英]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
之间有什么区别? :help errorformat-multi-line
以下列字符结尾: %\\\\@=%m
- WTF执行%\\\\@=
是什么意思? 我非常感谢帮助理解这些东西。
啊,错误errorformat
,每个人都喜欢讨厌的功能。 :)
有些元首先。
: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
读取来自编译器的输出线,并将其转换到pattern
在qflist
。 就是这样。 要查看它的工作原理, 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
?
是的,它由附加的匹配线的含量%+C
的message
通过对早期(不晚)多模式(产生%A
, %E
, %W
,或%I
)。
如果是的话,那么如果没有
%.%#
(== regexp.*
),但是,让我们说,%+Ccont.: %.%#
- 就像这样的工作只捕获一个cont.:
后的东西cont.:
字符串进入%m
?
%+Ccont.: %.%#
只考虑与regexp ^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限定符\\@=
,“匹配前面的原子与零宽度”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.