当Vimscript函数内部出现错误时,Vim会以下列格式报告错误:
Error detected while processing function <SNR>My_Function:
line X:
EXXX: Error Message Here
这非常令人分心。理想情况下,我希望以某种方式格式化以适合单行,但如果这不可能,那么我只想要最后一行EXXX与实际错误。有可能改变这个吗?
答案 0 :(得分:0)
我不喜欢这种行为,但它是如何,并且不能改变。
您的函数需要:catch
任何错误,并将其转换为所需的单行错误消息:
function! s:My_Function()
try
" commands here
catch /^Vim\%((\a\+)\)\=:/
echohl ErrorMsg
echomsg substitute(v:exception, '^\CVim\%((\a\+)\)\=:', '', '')
echohl None
endtry
endfunction
这是大多数插件处理它的方式。但是,该行为并不完全类似于内置命令:错误被有效地“吞噬”,并且尽管有错误,仍将执行后续命令(例如,在序列cmd1 | call <SID>My_Function() | cmd3
中)。对于大多数用途来说这是可以的,大多数用户可能甚至都没有意识到这一点。
要使自定义命令的行为类似于内置命令,需要将错误消息返回到自定义命令或映射,并:echoerr
在那里。在我的ingo-library plugin中,我有相应的辅助函数:
function! s:My_Function()
try
" commands here
return 1 " Success
catch /^Vim\%((\a\+)\)\=:/
call ingo#err#SetVimException()
return 0 " Failure, use stored error message.
endif
endfunction
if ! <SID>My_Function() | echoerr ingo#err#Get() | endif
答案 1 :(得分:0)
还有另一种解决问题的方法:可以解码错误消息。
在我的lh-vim-lib中,我定义了a function解码最后一条错误消息并在qf窗口中显示结果。
如果安装了lh-vim-lib,你需要添加类似
的内容command! WTF call lh#exception#say_what()
到.vimrc
。
这个功能本身受到了https://github.com/tweekmonster/exception.vim的启发,不同之处在于我已经使用了我已经在我的库插件中实现的内容,以便:
在我为了演示我的Dbc框架而录制的截屏视频结束时,我使用:WTF
以人性化的方式显示最后一个错误。