gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:30:49 27 4
gpt4 key购买 nike

我尝试阅读:help errorformat和谷歌搜索(主要是stackoverflow),但无法理解其中提到的某些模式:

  • %s-“指定要搜索的文本以找到错误行。[...]”
  • um,首先,尝试完全理解该句子,在%s之后,我应将“要搜索的文本”放在哪里?之前呢?或者,我不知道,这是否会污染整个模式? WTF?
  • 其次,此模式实际上是做什么的,它与模式中的常规文本(如某种set efm+=,foobar)有何不同?对我来说,“foobar”也是“要搜索的文本” ...:/
  • %+-例如我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吗?

  • 我非常感谢您对了解这些内容的帮助。

    最佳答案

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

    一些元优先。

  • 一些Vim命令(例如:make:cgetexpr)获取编译器的输出,并将其解析为quickfix列表。 errorformat是描述此解析完成方式的字符串。它是模式列表,每个模式都是regexp和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中的第一个错误实际上是指文件中的错误)。

  • 现在回答您的问题。

    um, first of all, trying to understand the sentence at all, where do I put the "text to search", after the %s? before it?



    你不知道 %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\$匹配的行,并将其发送给您。那是当前文件中的倒数第二行。

    secondly, what does this pattern actually do, how does it differ from regular text in a pattern, like some kinda set efm+=,foobar?


    set efm+=foobar %m将在编译器的输出中查找以 foobar开头的一行,然后将其余的行分配给相应错误中的 message字段。
    %s从编译器的输出中读取一行,并将其转换为相应错误中的 pattern字段。

    %+ - e.g. I I've seen something like that used in one question: %+C%.%# does it mean the whole line will be appended to a %m used in an earlier/later multiline pattern?



    是的,它将 %+C匹配的行的内容附加到较早(而不是后来)多行模式( message%A%E%W)产生的 %I上。

    if yes, then what if there was not %.%# (== regexp .*), but, let's say, %+Ccont.: %.%# - would something like that work to capture only stuff after a cont.: string into the %m?



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

    also, what's the difference between %C%.%# and %+C%.%# and %+G?


    %Chead %m trail匹配 ^head .* trail$,然后仅将中间部分附加到先前的 %m(它丢弃 headtrail)。
    %+Chead %m trail^head .* trail$匹配,然后将整行附加到上一个 %m(包括 headtrail)。
    %+Gfoo与以 foo开头的行匹配,并将整个行作为消息添加到 qflist中(即,仅具有 message字段的错误)。

    also, what's the difference between %A and %+A, or %E vs. %+E?


    %A%E启动多行模式。 %+似乎意味着“不管 message的位置如何,都将要解析的整行添加到 %m中”。

    finally, an example for Python in :help errorformat-multi-line ends with the following characters: %\\@=%m -- WTF does the %\\@= mean?


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

    关于vim - vim errorformat中一些高级模式的含义是什么? (%s,%+,%\\@ =),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29088436/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com