vim:如何连接错误行的不同部分"设置efm ="?

时间:2017-02-14 08:03:09

标签: vim format concat

我们的项目中有我们的lex / yacc生成的编译器,我的构建日志是这样的:

[timestamp] [info/debug/warning/error] [compiler pid] [filename/line] message

此构建错误日志的格式为:

let &errorformat = '[%.%#]%*[ \t][%t%*[A-Z]]%*[ \t][%n]%*[ \t][%f:%l]%m'

我的.vimrc用这一行:

mysource/impl.cpp|25 info 1743| Syntax warning

我可以使用" vi -q builderror.txt"并在quickfix窗口中显示如下:

mysource/impl.cpp|25 info 1743| Syntax warning [2017-02-13 16:37:41.123456]

好的没问题。

我的要求是:我希望将错误消息与时间戳信息连接起来,如下所示:

sealed trait newADT {
  val Id: Int
}

object newADTs {

  val value1 = VALUE1
  val value2 = VALUE2

  def apply(id: Int) = id match {

    case value1.Id => value1
    case value2.Id => value2
  }
}

case object VALUE1 extends newADT {
  override val Id: Int = 1
}
case object VALUE2 extends newADT{
  override val Id: Int = 2
}

然后我可以浏览所有构建错误并知道每个编译步骤所花费的时间。

那么如何显示我"设置efm ="或"让& errorformat ="?感谢。

2 个答案:

答案 0 :(得分:2)

单靠errorformat您无法做到这一点。您需要预处理错误以在解析之前移动时间戳。具体如何做到这一点取决于你如何解析所说的错误。

答案 1 :(得分:1)

正如@ sato-katsura所说,你必须移动Vim的时间戳,将其作为errorformat的一部分来接收。

这是在类UNIX系统上执行此操作的一种方法...

  1. 更改errorformat中的vimrc

    let &errorformat = '[%t%*[A-Z]]%*[ \t][%n]%*[ \t][%f:%l]%m'
    
  2. 按摩builderror.txt

    $ vim -q <(sed 's/^\(\[[^]]*\]\) \(.*\)/\2 \1/g' builderror.txt)
    
  3. 如果您不想在全球范围内更改errorformat,可以......

    • 将该行放在目录根目录的本地exrc中,请参阅:help 'exrc';

    • 将该行放在目录根目录的本地efm.txt中,然后像这样使用它:

      $ vim --cmd "source efm.txt" -q <(sed 's/^\(\[[^]]*\]\) \(.*\)/\2 \1/g' builderror.txt)
      
    • 将所有这些放在简单的bash脚本中:

      #!/usr/bin/env bash
      
      [ $# -eq 1 ] && vim --cmd "let &errorformat = '[%t%*[A-Z]]%*[ \t][%n]%*[ \t][%f:%l]%m'" -q <(sed 's/^\(\[[^]]*\]\) \(.*\)/\2 \1/g' "$1")
      
    • 可能还有十几个其他解决方案/解决方法......