我尝试阅读: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执行%\\@=
是什么意思?我非常感谢能帮助你理解这些东西。
答案 0 :(得分:14)
errorformat
,每个人都喜欢讨厌的特征。 :)
有些元首先。
:make
和:cgetexpr
)获取编译器的输出并将其解析为quickfix
列表。 errorformat
是一个字符串,描述了如何完成此解析。它是一个模式列表,每个模式都是正则表达式和scanf(3)
格式之间的混合。其中一些模式匹配编译器输出中的单行,其他模式尝试匹配多行(%E
,%A
,%C
等),其他模式保持各种状态(%D
,%X
),其他人改变解析进行的方式(%>
),而其他人只是在qflist
(%G
)中生成消息,或者忽略输入中的行( %-G
)。并非所有组合都有意义,在你看到Vim的来源之前,你很可能不会弄清楚所有的细节。 耸肩 errorformat
而不是let &erf='...'
来撰写set erf=...
。语法 更加人性化。errorformat
体验cgetexpr
。 cgetexpr
需要一个列表,它将其解释为编译器输出中的行。结果是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$
(它会丢弃%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
- WTF执行%\\@=%m
是什么意思?
%\\@=
转换为regexp限定符%\\@=
,“匹配前面的原子与零宽度”。