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

vim: how to concatenate different parts of a error line in "set efm="?

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

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

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

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

我的 .vimrc 中有这一行:

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

好吧,我可以使用 "vi -q builderror.txt" 并在 quickfix window 中显示,例如:

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

好的没问题。

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

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

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

那我怎么显示"set efm="或"let &errorformat="呢?谢谢。

仅靠 errorformat 是做不到的。您需要对错误进行预处理,以便在解析之前将时间戳移动到最后。具体如何做到这一点取决于您如何解析所述错误。

如@sato-katsura 所说,您必须移动 Vim 的时间戳才能将其作为 errorformat.

的一部分提取

这是在 UNIX-like 系统上执行此操作的一种方法……

  1. 更改 vimrc 中的 errorformat:

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

    $ vim -q <(sed 's/^\(\[[^]]*\]\) \(.*\)/ /g' builderror.txt)
    

如果您不想全局更改 errorformat,您可以...

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

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

    $ vim --cmd "source efm.txt" -q <(sed 's/^\(\[[^]]*\]\) \(.*\)/ /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/^\(\[[^]]*\]\) \(.*\)/ /g' "")
    
  • 可能还有十几个 solutions/workarounds…