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 系统上执行此操作的一种方法……
更改 vimrc
中的 errorformat
:
let &errorformat = '[%t%*[A-Z]]%*[ \t][%n]%*[ \t][%f:%l]%m'
按摩你的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…
我们的项目中有 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 系统上执行此操作的一种方法……
更改
vimrc
中的errorformat
:let &errorformat = '[%t%*[A-Z]]%*[ \t][%n]%*[ \t][%f:%l]%m'
按摩你的
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…