ghcide生成的多行错误消息的设置错误格式

时间:2019-11-22 16:57:03

标签: vim errorformat

我正在尝试为setup ghcide Omit<E, "id">生成以下输出。

errorformat

带有以下ghcide version: 0.0.4 (GHC: 8.6.5) Ghcide setup tester in /opt/devel/haskell/haskell-vim-now. Report bugs at https://github.com/digital-asset/ghcide/issues Step 1/6: Finding files to test in /opt/devel/haskell/haskell-vim-now Found 1 files Step 2/6: Looking for hie.yaml files that control setup Found 1 cradle Step 3/6, Cradle 1/1: Implicit cradle for /opt/devel/haskell/haskell-vim-now Cradle {cradleRootDir = "/opt/devel/haskell/haskell-vim-now", cradleOptsProg = CradleAction: default} Step 4/6, Cradle 1/1: Loading GHC Session Step 5/6: Initializing the IDE Step 6/6: Type checking the files File: foo.hs Range: 1:4-1:5 Source: typecheck Severity: DsError Message: ESC[0;91mfoo.hs:1:5: error: • No instance for (Num String) arising from the literal ‘5’ • In the expression: 5 In an equation for ‘x’: x = 5ESC[0m Completed (1 file worked, 0 files failed)

~/.vim/compiler/ghcide.vim

Quickfix缓冲区仅显示剩余的四行:

CompilerSet  errorformat=%-Gghcide\ %s
CompilerSet  errorformat+=%-GReport\ bugs\ at\ %s
CompilerSet  errorformat+=%-GStep\ %s
CompilerSet  errorformat+=%-GFound\ %s
CompilerSet  errorformat+=%-GCradle\ %s
CompilerSet  errorformat+=%-GRange:\ %s
CompilerSet  errorformat+=%-GFile:\ %s
CompilerSet  errorformat+=%-GSource:\ %s
CompilerSet  errorformat+=%-GSeverity:\ %s
CompilerSet  errorformat+=%-GCompleted\ %s
" exclude empty or whitespace-only lines
CompilerSet  errorformat+=%-G\\s%#
CompilerSet  errorformat+=%E!\ Message:%>%trror%m
setlocal makeprg=ghcide\ %

由于无法自行判断如何将上述多行消息映射到单个:clist 1: Message:- 2: ^[[0;91mfoo.hs:1:5: error: 3: • No instance for (Num String) arising from the literal ‘5’ 4: • In the expression: 5 条目中,因此我正在寻求帮助。

1 个答案:

答案 0 :(得分:1)

您可以尝试以下方法:

CompilerSet errorformat=%-Gghcide\ %s
CompilerSet errorformat+=%-GReport\ bugs\ at\ %s
CompilerSet errorformat+=%-GStep\ %s
CompilerSet errorformat+=%-GFound\ %s
CompilerSet errorformat+=%-GCradle\ %s
CompilerSet errorformat+=%-GRange:\ %s
CompilerSet errorformat+=%-GFile:\ %s
CompilerSet errorformat+=%-GSource:\ %s
CompilerSet errorformat+=%-GSeverity:\ %s
CompilerSet errorformat+=%-GCompleted\ %s
" exclude empty or whitespace-only lines
CompilerSet errorformat+=%-G\\s%#
CompilerSet errorformat+=%EMessage:%\\s%#%>
CompilerSet errorformat+=%C%\\s%#ESC[%\\d%#;%\\d%#m%f:%l:%c:%m
CompilerSet errorformat+=%C%m
CompilerSet errorformat+=%ZCompleted%m

与原始代码的区别在于最后四行:

CompilerSet errorformat+=%EMessage:%\\s%#%>
CompilerSet errorformat+=%C%\\s%#ESC[%\\d%#;%\\d%#m%f:%l:%c:%m
CompilerSet errorformat+=%C%m
CompilerSet errorformat+=%ZCompleted%m

最初,您使用了此

CompilerSet  errorformat+=%E!\ Message:%>%trror%m

但是在您提供的编译器输出中,Message:行不是以空格和空格开头,因此我认为应将其删除。

此外,%E已经将条目的类型设置为error,因此%t是不必要的。 而且该行上没有消息(该消息位于下一行),因此您不需要%m。 最后,在输出中,有一个尾随空格,因此您需要%\\s%#

所有这些都给了:

CompilerSet errorformat+=%EMessage:%\\s%#%>

但是您仍然需要提取文件名和行/列位置,可以通过resp获得。 %f%l%c

CompilerSet errorformat+=%C%\\s%#ESC[%\\d%#;%\\d%#m%f:%l:%c:%m

请注意,格式以%C开头,它告诉Vim它与多行消息的延续匹配(请参见:h errorformat-multi-line)。

最后,我想您需要其余的信息,直到Completed行,您可以通过以下方式获得该信息:

CompilerSet errorformat+=%C%m
CompilerSet errorformat+=%ZCompleted%m
相关问题