啊,errorformat
每个人都喜欢讨厌的功能。:)
首先是一些元数据。
- 一些 Vim 命令(例如
:make
和:cgetexpr
)获取编译器的输出并将其解析为quickfix
列表。 errorformat
是一个描述如何完成解析的字符串。scanf(3)
这是一个模式列表,每个模式都是正则表达式和格式之间的一种混合。其中一些模式匹配编译器输出中的单行,其他模式尝试匹配多行(%E
,%A
等%C
),其他模式保持各种状态(%D
, %X
),其他模式改变解析进行的方式(%>
),而其他模式只是在qflist
( %G
),或忽略输入 ( %-G
) 中的行。并不是所有的组合都有意义,而且在查看 Vim 的源代码之前,您很可能无法弄清楚所有细节。耸耸肩
- 你可能想用
errorformat
slet &erf='...'
而不是set erf=...
. 语法更加人性化。
- 您可以尝试
errorformat
使用cgetexpr
. cgetexpr
需要一个列表,它将其解释为编译器输出中的行。结果是qflist
(或语法错误)。
qflist
s 是错误列表,每个错误都是 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
早期/后期多行模式中使用的 a 上?
是的,它将匹配的行的内容附加%+C
到message
由较早(而不是较晚)多行模式(%A
、%E
、%W
或%I
)产生的内容。
如果是,那么如果没有%.%#
(== regexp .*
)怎么办,但是,比方说,%+Ccont.: %.%#
- 这样的东西是否可以仅捕获cont.:
字符串之后的内容到%m
?
不。%+Ccont.: %.%#
只考虑与正则表达式匹配^cont\.: .*$
的行,不匹配的行将被忽略。然后将整行附加到前一行%m
,而不仅仅是后面的部分cont.:
。
%C%.%#
另外, and%+C%.%#
和 和有什么区别%+G
?
%Chead %m trail
匹配^head .* trail$
,然后仅将中间部分附加到前一个%m
(它丢弃head
和trail
)。
%+Chead %m trail
匹配^head .* trail$
,然后将整行附加到前一行%m
(包括head
and trail
)。
%+Gfoo
匹配以 开头的行foo
并简单地将整行添加为消息qflist
(即只有一个message
字段的错误)。
%A
另外, and%+A
或%E
vs.之间有什么区别%+E
?
%A
并%E
开始多线模式。 %+
似乎意味着“添加被解析的整行message
,不管”的位置%m
。
最后,Python 的示例以:help errorformat-multi-line
以下字符结尾:%\\@=%m
-- WTF%\\@=
是什么意思?
%\\@=
转换为正则表达式限定符\@=
,“匹配前面的原子宽度为零”。