Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim 为ghcide生成的多行错误消息设置errorformat_Vim_Errorformat - Fatal编程技术网

Vim 为ghcide生成的多行错误消息设置errorformat

Vim 为ghcide生成的多行错误消息设置errorformat,vim,errorformat,Vim,Errorformat,我正在尝试errorformatfor,它将生成以下输出 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-vi

我正在尝试
errorformat
for,它将生成以下输出

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

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\ %
Quickfix buffer仅显示其余四行:

: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  
由于我自己无法理解如何将上述多行消息映射到单个
clist
条目,我正在寻求帮助。

您可以尝试以下方法:

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
与原始代码相比的差异在最后4行:

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
但是在您提供的编译器输出中,
消息:
行不是以bang和空格开头的,因此我认为应该删除它

此外,
%E
已经将条目的类型设置为
错误
,因此不需要
%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

最后,我认为您需要消息的其余部分,直到
完成
行,您可以使用:

CompilerSet errorformat+=%C%m
CompilerSet errorformat+=%ZCompleted%m

试试这个:@user938271非常感谢!它起作用了!请你把它写成一个答案好吗。